gpt4 book ai didi

perl - 当我使用 Perlapp 将 Perl 脚本转换为可执行文件时,为什么缺少一些字符?

转载 作者:行者123 更新时间:2023-12-02 04:23:16 24 4
gpt4 key购买 nike

在将我的问题发布到 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ǔ

还有一件事,我在Windows XP(中文版)上运行ActivePerl 5.10.0.,脚本保存为无BOM的utf-8编码。 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ǔ

最佳答案

ActiveState 还没有给我任何帮助。任何。现在我已经找到了解决问题的方法,而且这个解决方法看起来很奇怪。

首先,我向 DATA 部分添加了一些原本无用的 utf-8 编码字符,如下所示:

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

然后我删除了 use utf8;我的脚本中的杂注;然后我从以下代码行中删除了 utf8 标志:

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

现在变成了

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

但我必须保持以下代码行不变:

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

然后一切都很好,除了我收到“打印中的宽字符”警告。但我又添加了一行代码:

no warnings;

然后我执行了我的脚本,一切正常:)

这确实很奇怪。我怀疑这个问题是操作系统特定的。我的 Windows 系统也很可能有问题。我还尝试了 Perl2exe,编译后的可执行文件给了我一些“内存 0010c4 无法读取”错误。任何。我的问题已经被我自己解决了:)

关于perl - 当我使用 Perlapp 将 Perl 脚本转换为可执行文件时,为什么缺少一些字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com