我遇到了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
提前感谢任何建议/想法!
答案 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));
}
unac_string("UTF-8", $unicode)
通常会给出正确的结果,但同样的错误使得unac_string("UTF-8", $unicode)
和unac_string("UTF-8", $utf8)
都能给出错误的结果。不过,unac_string("UTF-8", encode("UTF-8", $unicode))
总会给出正确的结果。