删除或完全禁止空字符\ 0

时间:2013-10-28 04:45:29

标签: perl

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

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

3 个答案:

答案 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是“有问题的”,并且在提及的情况下它被区别对待。