Perl Text :: Unaccent有意想不到的结果

时间:2013-11-16 11:54:59

标签: perl unicode utf-8 iconv non-ascii-characters

我遇到了Text :: Unaccent模块的一些奇怪的系统相关问题。如果我错过了一些愚蠢的事情,我会道歉,但是我几个小时都没碰到这个问题而没有真正的进展。

我有一个简单的脚本设置,可以很好地显示问题。

#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Text::Unaccent;

my $string = 'aaâaa';
my $unacd = unac_string("UTF-8", $string);

print "Accented: $string \n";
print "Unaccented: $unacd \n";

我的生产服务器上的输出看起来很棒:

[user@prod]$ perl test_unaccent.pl 
Accented: aaâaa
Unaccented: aaaaa

我的开发服务器上的输出看起来很奇怪:

[user@dev]$ perl test_unaccent.pl 
Accented: aaâaa
Unaccented: UTF-8

它只打印出我传递给unac_string调用的字符集。

我已经检查了区域设置,尝试确保iconv正常工作(unac_string_utf16似乎有效),但我无法弄清楚可能是什么问题。

dev和prod服务器在几个关键方面肯定是不同的,但我看不出它是如何相关的。

prod:CentOS 5,Perl 5.8.8

dev:CentOS 6,Perl 5.10.1

提前感谢任何建议/想法!

1 个答案:

答案 0 :(得分:4)

我不知道为什么你会得到你的输出,但我要说的是没有用的。


您的$string不是UTF-8字节的字符串;它是一串Unicode代码点。正确使用 [1] 将是

 unac_string("UTF-8", encode("UTF-8", $string));

但是由于unac_string将字符串转换为UTF-16be(使用iconv),然后将字符串传递给unac_string_utf16,您也可以使用

 unac_string_utf16(encode("UTF-16be", $string));

你总是可以创建一个包装器

use Encode         qw( encode );
use Text::Unaccent qw( unac_string_utf16 );

sub unac_string {
   my ($enc, $str) = @_;
   return unac_string_utf16(encode("UTF-16be", $string));
}

  1. Text :: Unaccent(“Unicode Bug”)中的错误使得unac_string("UTF-8", $unicode)通常会给出正确的结果,但同样的错误使得unac_string("UTF-8", $unicode)unac_string("UTF-8", $utf8)都能给出错误的结果。不过,unac_string("UTF-8", encode("UTF-8", $unicode))总会给出正确的结果。
相关问题