Прежде чем отправлять мой вопрос на форум ActiveState, я хотел бы попробовать удачу здесь :)Почему некоторые символы отсутствуют, когда я преобразовал свой скрипт Perl в исполняемый файл с помощью Perlapp?
Я пытаюсь преобразовать простой скрипт моего в .exe-файл с помощью Perlapp (версия 8.1). Скрипт Perl отлично работает, и, похоже, Perlapp также успешно выполнил свою работу. Но преобразованный файл .exe имеет какое-то странное поведение, которое, я считаю, должно быть связано с кодировкой utf-8. Например, сценарий Perl даст результат, как:
hàn huáng zhòng sè sī qīng guó
Но запустив исполняемый файл бы мне только это:
h hu zh s s q gu
Я уже настроен Perlapp так что utf8.pm явно но проблема просто не уходит. Я попробовал что-то еще. Например,
binmode DATA, ":utf8";
и
">:encoding(utf8)"
но без везения;
Может ли кто-нибудь любезно дать мне некоторый намек на то, что может быть причиной? Спасибо, как всегда :)
я могу отправить весь код здесь, но это кажется ненужным, так что я просто вставить некоторые фрагменты кода, которые я думаю, это отношение к проблеме:
use utf8;
%zidian = map {chomp;split/\s+/,$_,2} <DATA>;
open my $in,'<:utf8',"./original.txt";
open my $out,'>:utf8',"./modified.txt";
if ($code~~%zidian) {
$value = lc$zidian{$code};
}
__DATA__
3400 Qiū
3401 TIǎN
3404 KUà
3405 Wǔ
И еще одна вещь, Я запускаю ActivePerl 5.10.0.on Windows XP (китайская версия), и скрипт сохраняется как кодировка utf-8 без спецификации. PerlApp не может обрабатывать скрипт, имеющий спецификацию.
Редактировать
Если бы я дать действенные сниппает, то я предполагаю, что это походит на предоставление всего кода, потому что я использую три соединенные между собой подпрограммы, которые я беру с некоторыми изменениями от Lingua :: han :: Модуль Pinyin и модуль Lingua :: han :: Utils.
#! perl
# to make good vertical alignment,
# set font family to SonTi and font size to Four(12pts)
use utf8;
sub Unihan {
my $hanzi = shift;
my @unihan = map { uc sprintf("%x",$_) } unpack ("U*", $hanzi);
}
sub csplit {
my $hanzi = shift;
my @return_hanzi;
my @code = Unihan($hanzi);
foreach my $code (@code) {
my $value = pack("U*", hex $code);
push @return_hanzi, $value if ($value);
}
return wantarray ? @return_hanzi : join('', @return_hanzi);
}
%zidian = map {chomp;split/\s+/,$_,2} <DATA>;
sub han2pinyin {
my $hanzi = shift;
my @pinyin;
my @code = Unihan($hanzi);
foreach $code (@code) {
if ($code~~%zidian) {
$value = lc$zidian{$code};
}
else {
$value = " ";
}
push @pinyin, $value;
}
return wantarray ? @pinyin : join('', @pinyin);
}
open $in,'<:utf8',"./original.txt";
seek $in, 3,0;
open $out,'>:utf8',"./modified.txt";
while(<$in>){
s/(.{18})/$1\n/g;
push @tmp, $_;
}
foreach (@tmp){
my @hanzi;
my @pinyin;
@hanzi = csplit($_);
my $hang = join "", @hanzi;
@pinyin = han2pinyin($hang);
for (my $i = 0; $i < @hanzi && $i < @pinyin; ++$i) {
if ($hanzi[$i] =~ /[\xEFBC8C]|[\xE38082]|[\xEFBC81]|[\xEFBC9F]|[\xE2809C]|[\xE2809D]|[\xEFBC9A]/) {
splice(@pinyin, $i, 0," ");
}
}
printf $out "%-7s" x @pinyin, @pinyin;
print $out "\n";
printf $out "%-6s" x @hanzi, @hanzi;
print $out "\n";
}
__DATA__
3400 Qiū
3401 TIǎN
3404 KUà
3405 Wǔ
Вам не нужно публиковать весь фрагмент кода, но необходим рабочий snipplet; откуда берутся $ code и $ value? –
@ Leon, спасибо за комментарий. Код обновлен :) – Mike
Попробуйте добавить 'use strict;'. Может быть, это поможет найти проблему. –