我正在使用Windows ActivePerl,但似乎永远无法获得UCS2小字节序文件的转换以正确转换为utf-8。最好的办法是进行适当的转换,除了第一行4个字符用奇怪的中文/日语字符拼凑而成,但文件的其余部分似乎没问题。
我真正想要做的是像往常一样做oneliner / search / replace perl正则表达式:
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 ++确实可以将其打开并可以正常识别,并且可以在记事本中进行编辑和重新保存,但是没有命令行功能...
答案 0 :(得分:2)
一种方法是完全避免使用perl,而只使用iconv -f UCS-2LE -t UTF-8 infile > outfile
,但是我不确定Windows是否可以使用它。
因此,以perl作为衬里:
$ perl -Mopen="IN,:encoding(UCS-2LE),:std" -C2 -0777 -pe 1 infile > outfile
-0777
结合-p
一次读取整个文件,而不是一次读取一行,这是您出错的一件事-当您的代码点是16位但您将它们视为8位的,找到行分隔符将是有问题的。 -C2
表示将UTF-8用于标准输出。-Mopen="IN,:encoding(UCS-2LE),:std"
说,输入流(包括标准输入)的默认编码为UCS-2LE(因此,它将与重定向输入一起使用,而不仅仅是文件)。有关详细信息,请参见open pragma (在脚本中为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