我在Windows机器上有一个Unicode格式的文件。有没有办法在使用perl脚本的Windows机器上将其转换为ASCII格式
这是UTF-16 BOM。
答案 0 :(得分:10)
如果要将unicode转换为ascii,则必须注意某些字符无法转换,因为它们在ascii中不存在。 如果你可以忍受,你可以试试这个:
#!/usr/bin/env perl
use strict;
use warnings;
use autodie;
use open IN => ':encoding(UTF-16)';
use open OUT => ':encoding(ascii)';
my $buffer;
open(my $ifh, '<', 'utf16bom.txt');
read($ifh, $buffer, -s $ifh);
close($ifh);
open(my $ofh, '>', 'ascii.txt');
print($ofh $buffer);
close($ofh);
如果你没有autodie,只需删除该行 - 然后你应该用
更改你的打开/关闭语句open(...) or die "error: $!\n";
如果您有无法转换的字符,您将在控制台上收到警告,输出文件将包含例如像
这样的文字\x{00e4}\x{00f6}\x{00fc}\x{00df}
在里面。 顺便说一句:如果你没有妈妈,但知道它是Big Endian(Little Endian),你可以将编码行更改为
use open IN => ':encoding(UTF-16BE)';
或
use open IN => ':encoding(UTF-16LE)';
希望它也能在Windows下运行。我现在不能试一试。
答案 1 :(得分:3)
查看Perl open命令的编码选项。您可以在打开文件进行读取或写入时指定编码:
这样的事情会起作用:
#! /usr/bin/env perl
use strict;
use warnings;
use feature qw(say switch);
use Data::Dumper;
use autodie;
open (my $utf16_fh, "<:encoding(UTF-16BE)", "test.utf16.txt");
open (my $ascii_fh, ">:encoding(ASCII)", ".gvimrc");
while (my $line = <$utf16_fh>) {
print $ascii_fh $line;
}
close $utf16_fh;
close $ascii_fh;