4
4

1 回答 1

5

你选择了一个难题。最好告诉输入 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 的克林贡字符和路线图标志呢?鱼字符看起来像一个a。谁来说什么是什么?

这是很多工作,但是如果您正在清理数据库输入,则必须创建一个字符白名单并阻止其他野蛮人,将他们排除在护城河之外,这是唯一可靠的方法。

于 2013-02-11T15:26:47.247 回答