如何在Windows机器上的perl脚本中将Unicode文件转换为ASCII文件

时间:2011-11-15 20:37:11

标签: windows perl unicode ascii

我在Windows机器上有一个Unicode格式的文件。有没有办法在使用perl脚本的Windows机器上将其转换为ASCII格式

这是UTF-16 BOM。

2 个答案:

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