如何将在UTF8中编码的非ASCII字符转换为Perl中的ASCII等效字符?

时间:2009-03-12 10:40:46

标签: perl utf-8 character-encoding ascii

我有一个Perl脚本,第三方正在调用该脚本向我发送已注册我软件的人的姓名。其中一方以UTF-8编码名称,所以我相应地调整了我的脚本,用Encode :: decode_utf8(...)将UTF-8解码为ASCII。

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

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

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

4 个答案:

答案 0 :(得分:12)

我相信你可以使用Text::Unidecode,这正是它试图做的事情。

答案 1 :(得分:0)

如果您必须处理不在ascii范围内的UTF-8数据,最好的办法是更改后端,以免在utf-8上出现问题。你会怎么做音译汉字?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

确保输入数据确实是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);