在Perl中正确处理UTF-8

Lan*_*nbo 3 perl utf-8 character-encoding latin1

我已经拿到了文件,(可能)中的Latin-1(ISO 8859-1)编码,并有一定的转换和数据挖掘罢了.输出应该是UTF-8,我已经尝试过任何关于Perl编码转换的内容,但没有一个产生任何可用的输出.

我知道use utf8;开始没什么作用.我试过Encode这个看起来很有前途的软件包:

open FILE, '<', $ARGV[0] or die $!;

my %tmp = ();
my $last_num = 0;

while (<FILE>) {
    $_ = decode('ISO-8859-1', encode('UTF-8', $_));

    chomp;
    next unless length;
    process($_);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过任何我能想到的组合,也被抛入其中binmode(STDOUT, ":utf8");,open FILE, '<:encoding(ISO-8859-1)', $ARGV[0] or die $!;等等.结果是乱序的变音符号,或者错误信息\xC3 is not a valid UTF-8 character,甚至是混合文本(有些是UTF-8,有些是拉丁文-1).

我想要的只是一种简单的方法来读取Latin-1文本文件并通过控制台生成UTF-8输出print.在Perl中有没有简单的方法呢?

cdt*_*its 5

也许是:

$_ = encode('utf-8', decode('ISO-8859-1', $_));
Run Code Online (Sandbox Code Playgroud)

数据是gb2312编码,因此可以将其转换为utf-8:

#!/usr/bin/env perl

use Encode qw(encode decode);

while (<DATA>) {
    $_ = encode('utf-8', decode('gb2312', $_));
    print;
}

__DATA__
Â׶ذÂÔË»á
Run Code Online (Sandbox Code Playgroud)


dax*_*xim 5

请参阅Perl编码简介Unicode cookbook.

  • 如果您要自己解码,最好确保您正在读取原始字节流.在这种情况下,您已将默认解码保留为读取决定执行的任何文件,这可能会受到影响.输出也是如此.你必须确保在STDOUT上没有设置任何东西来编码你给它的东西. (3认同)