我有一个这样的 Unicode 文件(十六进制):
0000000 bbef 00bf 0041 0030 0030 0030 0020 0020
0000010 0020 0020 0020 0030 0030 0030 0030 0030
0000020 0030 0030 0030 0030 0030 0030 0031 0032
0000030 0036 0031 0035 0032 0030 0030 0034 0034
0000040 0032 0031 0035 0032 0030 0031 0036 0031
0000050 0031 0030 0032 0030 0030 0030 0030 0030
0000060 0030 0031 0026 004f 0046 0031 002e 0033
.....
需要转换成ISO-8859-8和CP862编码。我是这样转换的encode('ISO-8859-8', NFC(encode('UTF-8', $line)))
,但是对于这两种编码中的任何一种,文件都转换不正确。
在 ISO-8859-8 中:
0000000 bb3f 003f 0041 0030 0030 0030 0020 0020
0000010 0020 0020 0020 0030 0030 0030 0030 0030
0000020 0030 0030 0030 0030 0030 0030 0031 0032
0000030 0036 0031 0035 0032 0030 0030 0034 0034
在 CP862 中:
0000000 5c3f 7b78 3030 6661 5c7d 7b78 3030 3861
0000010 007d 0041 0030 0030 0030 0020 0020 0020
0000020 0020 0020 0030 0030 0030 0030 0030 0030
0000030 0030 0030 0030 0030 0030 0031 0032 0036
脚本:
#!/usr/bin/perl
no warnings;
use utf8;
#use open ':std', ':encoding(UTF-8)';
use Text::Iconv;
use Unicode::Normalize qw(NFC);
use Encode qw(encode decode from_to);
use feature 'say';
for $filename (glob('*.TXT')) {
say "Where you want to save $filename in ISO-8859-8?";
$newfilename1 = <>;
chomp($newfilename1);
say "Where you want to save $filename in CP862?";
$newfilename2 = <>;
chomp($newfilename2);
open (FILE_IN, '<:encoding(utf8)', "$filename");
open (FILE_OUT1, '>:encoding(ISO-8859-8)', "$newfilename1");
open (FILE_OUT2, '>:encoding(CP862)', "$newfilename2");
while ($line = <FILE_IN>) {
$line = NFC(encode('UTF-8', $line));
print FILE_OUT1 encode('ISO-8859-8', $line);
print FILE_OUT2 encode('CP862', $line);
}
close (FILE_IN);
close (FILE_OUT1);
close (FILE_OUT2);
}
进行此转换的正确方法是什么?
结果,我通过 Bash 做到了:
我删除了 BOM 的前 3 个字节,并将 UTF16BE 转换为所需的编码。