为了索引和搜索的目的,我需要“展平”大量的Unicode字符串。例如,我需要将GötheФ€
转换为ASCII码。最后两个字符在ASCII中没有紧密的表示形式,所以完全丢弃它们是可以的。所以我所期望的是
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "GötheФ€");
是Gothe
,但它输出的是Gothe?EUR
。
除了字母,我还希望所有种类的Unicode数字和标点符号,如句点,逗号,破折号,斜杠等被它们最接近的ASCII对应物替换,这是iconv
函数中的ASCII//TRANSLIT//IGNORE
已经做的事情,但不是不产生一些垃圾输出的Unicode字符,它不能找到任何ASCII替换。我希望这样的字符被完全忽略。
如何获得预期的结果?有没有更好的方法,也许是使用intl
库?
发布于 2013-02-11 15:26:47
你选择了一个棘手的问题。最好告诉输入Unicode字符的用户自己音译ASCII。为他们这样做只会在他们不同意你的音译时让他们不高兴。
你做的任何事情都可能会让那些非常重视变音符号的人感到刺耳和冒犯:http://en.wikipedia.org/wiki/Diacritic
无论你使用哪种音译策略,你都不会让每个人都满意,因为不同的人对不同的字符有不同的定义。一个人喜欢的音译会激怒另一个人。除非您让每个人都使用他们想要的Unicode字符,否则您不会让每个人都满意。
但是生活是刺耳的和冒犯的,所以我们走吧:
此PHP代码:
function toASCII( $str )
{
return strtr(utf8_decode($str),
utf8_decode(
'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'),
'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy');
}
上面的函数所做的是替换utf8_decode的第一个参数中的每个Unicode字符,并用utf8_decode的第二个参数中的相应字符替换它。
例如,Unicode À
被音译为ASCII A
,而å
被转换为a
。您必须为您认为音译为ASCII字符的每个Unicode字符指定此参数。对于其他的,请删除它们或通过另一个音译算法运行它们。
您还需要查看95,221个其他字符,这些字符可能会音译为ASCII。它变成了一个“什么时候A
不再是A
?”的存在游戏。克林贡语字符和看起来有点像A的路线图标志呢?鱼的角色看起来有点像a
。谁来说什么是什么?
这是一项大量的工作,但如果你要清理数据库输入,你必须创建一个字符白名单,并屏蔽其他野人,将他们排除在护城河之外,这是唯一可靠的方法。
https://stackoverflow.com/questions/14814547
复制相似问题