5

我有一个 Perl 脚本,第三方调用它来向我发送注册我的软件的人的姓名。其中一方使用 UTF-8 对名称进行编码,因此我相应地调整了我的脚本,以使用 Encode::decode_utf8(...) 将 UTF-8 解码为 ASCII。

这通常可以正常工作,但每 6 个月左右,其中一个名称包含西里尔字母、希腊语或罗马尼亚语字符,因此对名称进行解码会产生诸如“ПодражанѡºÐ°Ñ”之类的垃圾字符。我必须跟进客户并要求他提供其姓名的“拉丁字符版本”,以便颁发注册码。

那么,是否有任何 Perl 模块可以检测是否存在此类字符并在必要时自动将它们转换为最接近的 ASCII 表示?

似乎我可以使用 Lingua::Cyrillic::Translit::ICAO 加上 Lingua::DetectCharset 来处理 Cyrillic,但我更喜欢与其他字符集一起使用的东西。

4

4 回答 4

10

我相信您可以为此使用Text::Unidecode,这正是它试图做的。

于 2009-03-12T14:21:35.107 回答
1

在 Text::Unicode 的文档中,在“Caveats”下,这个短语似乎是不正确的:

确保输入数据确实是 utf8 字符串。

UTF-8 是一种可变长度编码,而 Text::Unidecode 只接受每个字符的固定长度(两字节)编码。所以这句话应该是:

确保输入数据确实是一串两字节 Unicode 字符。

这也称为 UCS-2。

如果你想转换真正是 utf8 的字符串,你可以这样做:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
于 2014-09-30T15:34:26.460 回答
0

如果您必须处理不在 ascii 范围内的 UTF-8 数据,最好的办法是更改后端,使其不会在 utf-8 上阻塞。你会如何音译汉字符号?

于 2009-03-12T11:05:37.370 回答
0

如果您得到西里尔文本,则许多字符没有“最接近的 ASCII 表示”。

于 2009-03-12T14:25:02.650 回答