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中有没有简单的方法呢?
也许是:
$_ = 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)
$ piconv -f Latin1 -t UTF-8 < input.file > output.file
Run Code Online (Sandbox Code Playgroud)简单,带编码层:
use autodie qw(:all);
open my $input, '<:encoding(Latin1)', $ARGV[0];
binmode STDOUT, ':encoding(UTF-8)';
Run Code Online (Sandbox Code Playgroud)适度,手动de- /编码:
use Encode qw(decode encode);
use autodie qw(:all);
open my $input, '<:raw', $ARGV[0];
binmode STDOUT, ':raw';
while (my $raw = <$input>) {
my $line = decode 'Latin1', $raw, Encode::FB_CROAK | Encode::LEAVE_SRC;
my $result = process($line);
print {STDOUT} encode 'UTF-8', $result, Encode::FB_CROAK | Encode::LEAVE_SRC;
}
Run Code Online (Sandbox Code Playgroud)