首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当我使用Perlapp将Perl脚本转换为可执行文件时缺少一些字符?

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

Stack Overflow用户
提问于 2009-12-05 06:58:12
回答 1查看 414关注 0票数 4

在将我的问题发布到ActiveState论坛之前,我想在这里试试运气:)

我正在尝试使用Perlapp (Version8.1)将我的一个简单脚本转换为.exe文件。Perl脚本运行良好,Perlapp似乎也成功地完成了它的工作。但是转换后的.exe文件有一些奇怪的行为,我认为这肯定与utf-8编码有关。例如,Perl脚本将产生如下结果:

代码语言:javascript
复制
hàn    huáng  zhòng  sè     sī     qīng   guó 

但是,运行可执行文件只会给我以下结果:

代码语言:javascript
复制
h      hu     zh     s      s      q      gu

我已经配置了Perlapp,这样可以显式地添加utf8.pm,但是问题就是没有解决。我尝试过其他的方法。例如,

代码语言:javascript
复制
binmode DATA, ":utf8"; 

代码语言:javascript
复制
">:encoding(utf8)"

但没有任何运气;

有谁能给我一些提示,说明原因是什么?像往常一样感谢:)

我可以在这里发布整个代码,但似乎没有必要,所以我只需要粘贴一些我认为与问题相关的代码片段:

代码语言:javascript
复制
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 (中文版本)上运行ActivePerl 5.10.0,脚本保存为utf-8,没有BOM。PerlApp无法处理具有BOM的脚本。

编辑

如果我要给出一个可行的代码片段,那么我想这就像给出了整个代码,因为我使用了三个相互连接的子例程,这些子程序由Lingua::han::拼音模块和Lingua::han::Utils模块进行修改。

代码语言:javascript
复制
#! 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ǔ
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-09 11:27:47

ActiveState还没给我任何帮助。管他呢。现在我已经想出了解决问题的办法,这个解决办法看上去很奇怪。

首先,我向数据部分添加了一些其他无用的utf-8编码字符,如下所示:

代码语言:javascript
复制
__DATA__
aardvark 'ɑ:dvɑ:k
aardwolf 'ɑ:dwulf
aasvogel 'ɑ:sfәugәl
3400    Qiū
3401    TIǎN
3404    KUà
3405    Wǔ

然后,我从脚本中删除了使用utf8;从脚本中移除了utf8标志,然后从下面的代码行中删除了utf8标志:

代码语言:javascript
复制
open $out,'>:utf8',"./modified.txt";

现在它变成

代码语言:javascript
复制
open $out,'>',"./modified.txt";

但我不得不让下面的代码行保持不变:

代码语言:javascript
复制
open $in,'<:utf8',"./original.txt";

然后一切都好,除了我会收到“宽字符印刷”警告。但我增加了另一行代码:

代码语言:javascript
复制
no warnings;

然后我修改了我的脚本,一切都很好:)

这真的很奇怪。我怀疑这个问题在某种程度上是操作系统特有的。我的Windows系统也很可能出了问题。我还尝试了Perl2exe,编译后的可执行文件给了我一些“内存0010c4无法读取”错误。管他呢。我的问题是由我自己解决的:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1851408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档