在将我的问题发布到ActiveState论坛之前,我想在这里试试运气:)
我正在尝试使用Perlapp(版本8.1)将我的简单脚本转换为.exe文件。 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编码,没有BOM。 PerlApp无法处理具有BOM的脚本。
修改
如果我要提供一个可行的片段,那么我想这就像给出整个代码一样,因为我使用了三个相互连接的子例程,我从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 :(得分:1)
ActiveState还没有给我任何帮助。随你。现在我已经找到了解决问题的方法,这个解决方法看起来很奇怪。
首先,我在我的DATA部分添加了一些无用的utf-8编码字符,如下所示:
__DATA__
aardvark 'ɑ:dvɑ:k
aardwolf 'ɑ:dwulf
aasvogel 'ɑ:sfәugәl
3400 Qiū
3401 TIǎN
3404 KUà
3405 Wǔ
然后我删除了使用utf8;我脚本中的pragma; 然后我从以下代码行中删除了utf8标志:
open $out,'>:utf8',"./modified.txt";
现在变成了
open $out,'>',"./modified.txt";
但我必须让以下代码行保持不变:
open $in,'<:utf8',"./original.txt";
然后一切都没问题,除了我收到“打印中的宽字符”警告。但我添加了另一行代码:
no warnings;
然后我Perlapped我的脚本,一切正常:)
这真的很奇怪。我怀疑这个问题是某种特定的操作系统。我的Windows系统也很可能出现问题。我也试过Perl2exe和编译后的可执行文件给了我一些“内存0010c4无法读取”的错误。随你。我的问题以某种方式由我自己解决:)