Perl或PowerShell如何从UCS-2 Little Endian转换为UTF-8或进行Inline Oneli



我正在使用Windows ActivePerl,我似乎永远无法获得UCS2 Little Endian文件的转换以正确转换为UTF-8。我能召集的最好的是,似乎是正确的转换,除了4个字符的第一行被奇怪的中文/日语字符串起,但其余的文件似乎还可以。

我真正想要的是进行Oneliner/搜索/替换通常的Perl Regex:

perl -pi.bak -e 's/replacethis/withthat/g;' my_ucs2file.txt

那是行不通的,所以我首先尝试查看perl是否可以进行适当的转换,我被卡住了,我正在使用:

perl -i.BAKS -MEncode -p -e "Encode::from_to($_, 'UCS-2', 'UTF-8')" My_UCS2file.txt

我尝试使用UCS2UCS-2LE,但仍然无法进行正确的转换。

我记得某个地方必须在UCS2文件开始时删除几个位或某些内容才能使转换工作,但我不记得了...

当我尝试PowerShell时,它抱怨它不知道UCS2/UCS-2 ... ??

感谢任何想法。我注意到Notepad 确实打开了它并识别它,我可以在记事本中进行编辑和重新解放,但是没有命令行能力...

一种衬里的方法是避免完全使用perl并只使用 iconv -f UCS-2LE -t UTF-8 infile > outfile,但是我不确定在Windows上是否可用。

so,将perl作为一个衬里:

$ perl -Mopen="IN,:encoding(UCS-2LE),:std" -C2 -0777 -pe 1 infile > outfile
  • -0777-p结合一次,一次读取整个文件,而不是一次,这是您出错的一件事 - 当您的CodePoints是16位时,您将它们视为8位,找到它们线分离器将是有问题的。
  • -C2说使用UTF-8进行标准输出。
  • -Mopen="IN,:encoding(UCS-2LE),:std"说,输入流的默认编码(包括标准输入((因此它将与重定向输入一起使用,而不仅仅是文件(是UCS-2LE。有关详细信息,请参见开放的巴格马(在脚本中是use open IN => ':encoding(UCS-2LE)', ':std';(。说到编码,您遇到的另一个问题是UCS-2UCS-2BE的同义词。有关详细信息,请参见Encode :: Unicode。

,一次只读取文件,从UCS-2LE转换为Perl的内部编码,然后再次将其打印为UTF-8。

如果您不必担心Windows线路结束转换,

$ perl -MEncode -0777 -pe 'Encode::from_to($_, "UCS-2LE", "UTF-8")' infile > outfile

也可以工作。


如果您也希望输出文件在UCS-2LE中,而不仅仅是在编码之间转换:

$ perl -Mopen="IO,:encoding(UCS-2LE),:std" -pe 's/what/ever/' infile > outfile

最新更新