1

我有一个脚本,MM.pl它是“主力”和一个简单的“补丁文件”,它可以从中读取。在这种情况下,补丁文件以 .ini 文件为目标进行搜索和替换。很简单。\0我花了 5 天时间才意识到 ini在每个字母之间是用 null ( ) 字符编码的。从那时起,我尝试了所有可以在代码片段、use::函数和正则表达式中找到的选项。我发现它的唯一原因是我曾经use Data::Printer;转储几个值。在 Notepad++ 中,ini 似乎被编码为 USC-2 LE。重要的是MM.pl处理任务而不是要求用户“修复”问题。

更新:这可能会提供线索 \xFF\xFE 是 ini 文件中的前 2 个字符。它们在处理后出现。交换实际上并没有像它应该的那样改变任何其他东西,而是“揭示”了 2 个隐藏的字符。

4

3 回答 3

8

正如您所注意到的,这些空值不仅仅是要被剥离的垃圾;它们是文件字符编码的一部分。所以解码它:

open my $fh, '<:encoding(UCS-2)', 'file.ini';

完成后以相同的方式将其写回。

于 2013-10-28T04:50:11.377 回答
1

读取文件时设置编码

my $fh = IO::File->open( "< something.ini" );
binmode( $fh, ":encoding(UTF-16LE)" );

当你输出时,你可以写回任何你喜欢的编码。例如

my $out = IO::File->open( "> something-new.ini" );
binmode( $out, ":encoding(UTF-8)" );

或者即使你正在转储到终端

binmode( STDOUT, ":encoding(UTF-8)" );
于 2013-10-28T04:51:56.163 回答
0

老实说,这真的不是一个解决方案,而是一种逃避。经过4周的尝试和重试方法,以及阅读和阅读和阅读,我已经将它放在公园并切换到python来构建应用程序。perldocs 中的一些参考文献提到 UTF16 是“有问题的”,并且在提到的情况下,它的处理方式也不同。

于 2013-11-05T07:54:30.777 回答