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

Des*_*ume 5 php unicode transliteration character-encoding iconv

为了索引和搜索的目的,我需要“展平”一些 Unicode 字符串。例如,我需要转换G\xc3\xb6the\xd0\xa4\xe2\x82\xac为 ASCII。最后两个字符在 ASCII 中没有紧密的表示,因此可以完全丢弃它们。所以我的期望是

\n\n
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "G\xc3\xb6the\xd0\xa4\xe2\x82\xac");\n
Run Code Online (Sandbox Code Playgroud)\n\n

Gothe,但它输出Gothe?EUR.

\n\n

除了字母之外,我还希望将所有各种 Unicode 数字和标点符号(例如句号、逗号、破折号、斜杠等)替换为最接近的 ASCII 对应项,这在ASCII//TRANSLIT//IGNORE函数中已经做到了,iconv但还没有不会为无法找到任何 ASCII 替换的 Unicode 字符生成一些垃圾输出。我希望这些角色被完全忽略。

\n\n

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

\n

Eri*_*ski 5

你选择了一个难题。最好告诉用户输入 Unicode 字符时自己转写 ASCII。当他们不同意你的音译时,为他们这样做只会让他们感到不安。

\n\n

您所做的任何事情都可能会令那些对变音符号赋予重要意义的人感到不和谐和冒犯:http://en.wikipedia.org/wiki/Diacritic

\n\n

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

\n\n

但生活是不和谐且令人反感的,所以我们走吧:

\n\n

这段 PHP 代码:

\n\n
function toASCII( $str )\n{\n    return strtr(utf8_decode($str),\n        utf8_decode(\n        \'\xc5\xa0\xc5\x92\xc5\xbd\xc5\xa1\xc5\x93\xc5\xbe\xc5\xb8\xc2\xa5\xc2\xb5\xc3\x80\xc3\x81\xc3\x82\xc3\x83\xc3\x84\xc3\x85\xc3\x86\xc3\x87\xc3\x88\xc3\x89\xc3\x8a\xc3\x8b\xc3\x8c\xc3\x8d\xc3\x8e\xc3\x8f\xc3\x90\xc3\x91\xc3\x92\xc3\x93\xc3\x94\xc3\x95\xc3\x96\xc3\x98\xc3\x99\xc3\x9a\xc3\x9b\xc3\x9c\xc3\x9d\xc3\x9f\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\xc3\xa6\xc3\xa7\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab\xc3\xac\xc3\xad\xc3\xae\xc3\xaf\xc3\xb0\xc3\xb1\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6\xc3\xb8\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc\xc3\xbd\xc3\xbf\'),\n        \'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy\');\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

例如,Unicode\xc3\x80被音译为 ASCII A,而 则被\xc3\xa5转换为a. 您必须为您认为会音译为 ASCII 字符的每个 Unicode 字符指定此项。对于其他的,删除它们或通过另一种音译算法运行它们。

\n\n

您还需要查看其他 95,221 个可能音译为 ASCII 的字符。A它变成了一场“什么时候不再是?”的存在主义游戏A。克林贡字符和看起来像 A 的路线图标志怎么样?鱼的性格有点像a。谁能说出什么是什么?

\n\n

这是一项繁重的工作,但如果你要清理数据库输入,你必须创建一个字符白名单,并封锁其他野蛮人,将他们拒之门外,这是唯一可靠的方法。

\n