我有一个脚本MM.pl
,它是“主力”,它是一个简单的“补丁文件”。在这种情况下,修补程序文件的目标是.ini文件以进行搜索和替换。很简单。我花了5天时间才意识到ini在每个字母之间用空(\0
)字符编码。从那以后,我尝试了在代码片段,use::
函数和正则表达式中都能找到的每个选项。
我发现它的唯一原因是我使用use Data::Printer;
转储了几个值。在Notepad ++中,ini似乎被编码为USC-2 LE。重要的是MM.pl
处理任务而不是要求用户“修复”问题。
更新:这可能提供线索\ xFF \ xFE是ini文件中的前2个字符。它们在处理后出现。交换实际上并没有像它应该的那样改变任何其他东西,而是“揭示”2个隐藏的角色。
答案 0 :(得分:8)
正如您所注意到的那样,这些空值不只是被剥离的垃圾;它们是文件字符编码的一部分。所以解码它:
open my $fh, '<:encoding(UCS-2)', 'file.ini';
一旦完成,就以同样的方式将其写回。
答案 1 :(得分:1)
当您阅读文件时设置编码
my $fh = IO::File->open( "< something.ini" );
binmode( $fh, ":encoding(UTF-16LE)" );
当你输出时,你可以回写任何你喜欢的编码。 e.g。
my $out = IO::File->open( "> something-new.ini" );
binmode( $out, ":encoding(UTF-8)" );
或者即使您正在倾销终端
binmode( STDOUT, ":encoding(UTF-8)" );
答案 2 :(得分:0)
说实话,这不是一个解决方案,而是一个拼写。经过4周的尝试和重试方法,阅读,阅读和阅读,我把它放在公园并切换到python来构建应用程序。在perldocs中提到的几个引用UTF16是“有问题的”,并且在提及的情况下它被区别对待。