1

perl 中有没有办法确定字符串utf-8cp1252编码是哪一个?

4

2 回答 2

1

核心Encode::Guess应该能胜任这个任务

use Encode::Guess;

my $enc = guess_encoding($data, qw(cp1252));  # utf8 among defaults

接着

ref($enc) or die "Can't guess: $enc"; # trap error this way
$utf8 = $enc->decode($data);

(来自文档)。

为了使用默认的“ ascii, utf8 and UTF-16/32 with BOM ”,先改变一下

Encode::Guess->set_suspects(qw(utf8 cp1252));

然后获取编码

my $enc = guess_encoding($data);

或者,从文档中复制

my $decoder = Encode::Guess->guess($data);
die $decoder unless ref($decoder);
my $utf8 = $decoder->decode($data);

有关详细信息,请参阅文档。


有很多不同之处;请参阅Tripleee的评论,例如这篇文章

于 2017-12-12T05:23:25.120 回答
1
my $could_be_utf8 = utf8::decode( my $tmp = $string );

my $could_be_cp1252 = $string !~ /[\x81\x8D\x8F\x90\x9D]/;

如果您需要处理同时包含两者的字符串,请参阅修复包含 UTF-8 和 Windows-1252 的文件

于 2017-12-12T15:16:18.740 回答