将Unicode字符转换为等效的ASCII字符

时间:2013-02-11 14:50:48

标签: php unicode character-encoding iconv transliteration

为了索引和搜索,我需要“展平”许多Unicode字符串。例如,我需要将GötheФ€转换为ASCII。最后两个字符在ASCII中没有密切的表示,因此可以完全丢弃它们。所以我期待

echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "GötheФ€");

Gothe,而是输出Gothe?EUR

除了字母之外,我还喜欢各种各样的Unicode数字和标点符号,例如句点,逗号,短划线,斜线等等,用它们最接近的ASCII对应物替换,这是{{1}在ASCII//TRANSLIT//IGNORE函数中已经但不是没有为Unicode字符生成一些垃圾输出,因为它无法找到任何ASCII替换。我希望这些角色完全被忽略。

如何获得预期的结果?有没有更好的方法,也许使用iconv库?

2 个答案:

答案 0 :(得分:4)

你选择了一个难题。最好告诉用户输入Unicode字符以自己音译ASCII。为他们做这件事只会在他们不同意你的音译时打扰他们。

你做的任何事情都可能会对那些对变音符号有重要意义的人产生不和谐和冒犯:http://en.wikipedia.org/wiki/Diacritic

无论你使用什么音译策略,你都不会取悦所有人,因为不同的人对不同的角色规定了不同的含义。让一个人高兴的音译会激怒另一个人。除非你让每个人在Unicode中使用他们想要的任何字符,否则你不会让每个人都开心。

但生活很刺耳,令人反感,所以我们走了:

此PHP代码:

function toASCII( $str )
{
    return strtr(utf8_decode($str),
        utf8_decode(
        'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
        'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}

上面的PHP函数所做的是替换utf8_decode的第一个参数中的每个Unicode字符,并将其替换为utf8_decode的第二个参数中的相应字符。

例如,Unicode À被音译为ASCII Aå被转换为a。您必须为您认为音译为ASCII字符的每个Unicode字符指定此字符。对于其他人,删除它们或通过另一个音译算法运行它们。

您需要查看95,221个其他字符,这些字符可能会音译为ASCII。它成为“何时A不再是A?”的存在主义游戏。那个看起来像A的Klingon角色和路线图标志怎么样?鱼的角色看起来像a。谁该说什么是什么?

这是很多工作,但如果你正在清理数据库输入,你必须创建一个白色的字符列表并阻止其他野蛮人,让他们在护城河,这是唯一可靠的方式。

答案 1 :(得分:1)

有关intl Normalizer功能的php.net comment可能有用: