Perl或Powershell如何从UCS-2 little endian转换为utf-8或进行内联oneliner搜索替换UCS-2文件上的正则表达式

时间:2019-05-07 01:34:47

标签: windows shell powershell perl cmd

我正在使用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

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

我记得有人在UCS2文件的开头删除了几位或某些东西才能使转换正常工作,但我不记得了...

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

赞赏任何想法。我注意到NotePad ++确实可以将其打开并可以正常识别,并且可以在记事本中进行编辑和重新保存,但是没有命令行功能...

1 个答案:

答案 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-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