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

标签 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 服务器在一些关键方面肯定是不同的,但我看不出它是如何相关的。

产品: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));
}

  • Text::Unaccent(“Unicode 错误”)中的一个错误导致 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/

    相关文章:

    windows - 如何强制 Perl 脚本使用 ActiveState 的 wperl?

    ABNF 的 Unicode 版本?

    c++ - 将一串多字节字符转换为宽字符会产生意想不到的结果

    Delphi 2010 - IBX - UTF8 - dbmemo 问题

    ruby-on-rails - 传递到生产环境时,rails 应用程序中的 UTF-8 问题

    php - Zend Framework 和 UTF-8 字符的问题 (æøå)

    arrays - 如何将数组存储为 Perl 散列中的值?

    windows - 当我从 Perl 调用命令时,如何抑制 "notify Microsoft"崩溃对话框?

    perl - 在 Perl 调试器中中断 `die`

    html - 使用 attr(data-icon) 属性在元素之前显示 unicode