我正在使用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
我尝试使用UCS2
或UCS-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-2
是UCS-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