我在 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 服务器在一些关键方面肯定是不同的,但我看不出它是如何相关的。
产品:CentOS 5,Perl 5.8.8
开发:CentOS 6、Perl 5.10.1
提前感谢您的任何建议/想法!
最佳答案
我不知道为什么你会得到你现在的输出,但我要说的是没有实际意义的。
您的 $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))
不过,总会给出正确的结果。 关于Perl Text::Unaccent 有意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20018125/