【发布时间】:2014-05-17 02:09:50
【问题描述】:
我正在从 XML 文件中提取字符串,即使它应该是纯 UTF-8,但它不是。我的想法是
#!/usr/bin/perl
use warnings;
use strict;
use Encode qw(decode encode);
use Data::Dumper;
my $x = "m\x{e6}gtig";
my $y = "m\x{c3}\x{a6}gtig";
my $a = encode('UTF-8', $x);
my $b = encode('UTF-8', $y);
print Dumper $x;
print Dumper $y;
print Dumper $a;
print Dumper $b;
if ($x eq $y) { print "1\n"; }
if ($x eq $a) { print "2\n"; }
if ($a eq $y) { print "3\n"; }
if ($a eq $b) { print "4\n"; }
if ($x eq $b) { print "5\n"; }
if ($y eq $b) { print "6\n"; }
输出
$VAR1 = 'm�gtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
3
在只有 latin1 字符串会增加其长度的想法下,但编码已经 UTF-8 也会使其更长。所以我无法以这种方式检测 latin1 与 UTF-8。
问题
我希望始终使用 UTF-8 字符串,但如何检测它是 latin1 还是 UTF-8,所以我只转换 latin1 字符串?
如果字符串是 UTF-8,则能够获得是/否同样有用。
【问题讨论】:
-
您想要一个解决方案来猜测正确的字符集是什么,还是想要一些准确的?因为,后者是不可能的。
-
如果不能准确做到,那就猜总比没有好=)
-
@deviantfan,猜测非常准确。请参阅我的答案中的脚注。
-
@ikegami:还在猜测。我并不是说这很糟糕,但这不会改变事实。
-
您不能通过返回向您提供这些数据的人并要求他们提供有效的 UTF8 来避免这一切吗?
标签: perl unicode encoding utf-8 latin1