【问题标题】:How to determine whether utf-8 or cp1252 encoding? [duplicate]如何判断是utf-8还是cp1252编码? [复制]
【发布时间】:2018-05-25 17:23:49
【问题描述】:

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

【问题讨论】:

  • 如果在 0x80-0xFF 范围内至少有几个字节,如果它们在 CP1252 中,它们将很快产生无效的 UTF-8。请参阅建议的副本以了解如何检测。
  • 我有人们从 Windows 或 Mac 创建的文件名,这意味着它是 cp1252utf8,我需要一种方法来自动确定它是哪个。
  • 让我这样说吧:UTF-8 对于有效序列的构成要素非常挑剔。每个随机字符串都是有效的 cp1252,但很少有随机字符串是有效的 UTF-8。当然,如果文件名不包含 0x80-0xFF 范围内的任何字符,则它是有效的 UTF-8 CP1252,并且在两种情况下语义相同。
  • 当然,真正的方法是让提供给您的人不要遗漏重要信息。
  • 我看不出这真的是重复的(标记的);虽然这是一个有用的页面,但它只是实现这一目标的一种方式。我添加了来自 ikegami 的答案的链接。找到更多会有所帮助。

标签: perl encoding utf-8 cp1252


【解决方案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 的评论,例如this post

【讨论】:

    【解决方案2】:
    my $could_be_utf8 = utf8::decode( my $tmp = $string );
    
    my $could_be_cp1252 = $string !~ /[\x81\x8D\x8F\x90\x9D]/;
    

    如果您需要处理包含两者混合的字符串,请参阅Fixing a file consisting of both UTF-8 and Windows-1252

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 1970-01-01
      • 2013-02-20
      • 2015-01-17
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      相关资源
      最近更新 更多