2009-12-05 1 views
4

Прежде чем отправлять мой вопрос на форум 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ǔ 
+0

Вам не нужно публиковать весь фрагмент кода, но необходим рабочий snipplet; откуда берутся $ code и $ value? –

+0

@ Leon, спасибо за комментарий. Код обновлен :) – Mike

+0

Попробуйте добавить 'use strict;'. Может быть, это поможет найти проблему. –

ответ

1

ActiveState пока не предоставил мне никакой помощи. Без разницы. Теперь я выяснил обходное решение для моей проблемы, и это обходное решение выглядит очень странно.

Сначала я добавил несколько иначе бесполезных utf8 закодированные символы в моей секции DATA, как показано на следующем:

__DATA__ 
aardvark 'ɑ:dvɑ:k 
aardwolf 'ɑ:dwulf 
aasvogel 'ɑ:sfәugәl 
3400 Qiū 
3401 TIǎN 
3404 KUà 
3405 Wǔ 

А потом я удалил использовать utf8; прагма из моего сценария; , а затем я снял флаг utf8 со следующей строки кода:

open $out,'>:utf8',"./modified.txt"; 

Теперь становится

open $out,'>',"./modified.txt"; 

Но я должен был позволить следующую строку кода без изменений:

open $in,'<:utf8',"./original.txt"; 

Тогда все было в порядке, за исключением того, что я получал предупреждения «широкие символы в печати».Но я добавил еще одну строку кода:

no warnings; 

А потом я Perlapped мой сценарий и все работало нормально :)

Это действительно странно. Я подозреваю, что эта проблема как-то специфична для ОС. Также вполне вероятно, что что-то не так с моей системой Windows. И я также пробовал Perl2exe, и скомпилированный исполняемый файл дал мне ошибку «память 0010c4 не может быть прочитана». Без разницы. Моя проблема как-то исправлена ​​мной :)