社区首页 >问答首页 >将Unicode字符转换为等效的ASCII字符

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

Stack Overflow用户
提问于 2013-02-11 14:50:48
回答 1查看 8.2K关注 0票数 3

为了索引和搜索的目的,我需要“展平”大量的Unicode字符串。例如,我需要将GötheФ€转换为ASCII码。最后两个字符在ASCII中没有紧密的表示形式,所以完全丢弃它们是可以的。所以我所期望的是

代码语言:javascript
代码运行次数:0
复制
echo iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", "GötheФ€");

Gothe,但它输出的是Gothe?EUR

除了字母,我还希望所有种类的Unicode数字和标点符号,如句点,逗号,破折号,斜杠等被它们最接近的ASCII对应物替换,这是iconv函数中的ASCII//TRANSLIT//IGNORE已经做的事情,但不是不产生一些垃圾输出的Unicode字符,它不能找到任何ASCII替换。我希望这样的字符被完全忽略。

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

EN

回答 1

Stack Overflow用户

发布于 2013-02-11 15:26:47

你选择了一个棘手的问题。最好告诉输入Unicode字符的用户自己音译ASCII。为他们这样做只会在他们不同意你的音译时让他们不高兴。

你做的任何事情都可能会让那些非常重视变音符号的人感到刺耳和冒犯:http://en.wikipedia.org/wiki/Diacritic

无论你使用哪种音译策略,你都不会让每个人都满意,因为不同的人对不同的字符有不同的定义。一个人喜欢的音译会激怒另一个人。除非您让每个人都使用他们想要的Unicode字符,否则您不会让每个人都满意。

但是生活是刺耳的和冒犯的,所以我们走吧:

此PHP代码:

代码语言:javascript
代码运行次数:0
复制
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。谁来说什么是什么?

这是一项大量的工作,但如果你要清理数据库输入,你必须创建一个字符白名单,并屏蔽其他野人,将他们排除在护城河之外,这是唯一可靠的方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14814547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档