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

4

我需要将多个Unicode字符串“压平”以进行索引和搜索。例如,我需要将 GötheФ€ 转换为ASCII码。最后两个字符在ASCII中没有相近的表示,所以完全舍弃它们是可以的。因此,我希望得到以下结果:

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

输出的是Gothe?EUR,而不是Gothe

除了字母外,我还希望所有类型的Unicode数字和标点符号,例如句号、逗号、破折号、斜杠等,都能被它们最接近的ASCII字符替换,这是iconv函数中的ASCII//TRANSLIT//IGNORE已经实现的,但对于无法找到任何ASCII替代字符的Unicode字符,会产生一些垃圾输出。我希望这样的字符被完全忽略掉。

如何获得预期结果?是否有更好的方法,可能使用intl库?


可能的重复问题,从Unicode中删除变音符号:https://dev59.com/_nA65IYBdhLWcg3w9DmF - Eric Leschinski
@EricLeschinski 不仅仅是音标符号。例如,右斜杠至少有4个Unicode字符(002F033820442215),我希望它们全部变成002F - Desmond Hume
1
我想知道 - 为什么在2013年还有人需要ASCII?使用UTF-8即可。 - Pavel Radzivilovsky
1个回答

5
您选择了一个难题。最好让用户自己转换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。谁能说出这些字符的真正含义?
这是一项繁重的工作,但如果您正在清理数据库输入,就必须创建一个白名单,并阻止其他野蛮人进入堡垒,这是唯一可靠的方法。

1
最好的部分?要翻译的字符串以[SOZ]开头。 - Quentin Skousen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接