【问题标题】:Converting Unicode characters into the equivalent ASCII ones将 Unicode 字符转换为等效的 ASCII 字符
【发布时间】:2013-01-26 16:43:18
【问题描述】:

出于索引和搜索的目的,我需要“展平”一些 Unicode 字符串。例如,我需要将GötheФ€ 转换为ASCII。最后两个字符在 ASCII 中没有紧密的表示,因此可以完全丢弃它们。所以我的期望是什么

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

Gothe,但它输出Gothe?EUR

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

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

【问题讨论】:

  • 可能的欺骗,从 Unicode 中删除变音符号:stackoverflow.com/questions/3542717/…
  • @EricLeschinski 不仅仅是变音符号。例如,右斜杠至少有 4 个 Unicode 字符(002F033820442215),我希望它们都变成002F
  • 我想知道 - 为什么有人在 2013 年需要 ASCII?使用 UTF-8..

标签: php unicode character-encoding iconv transliteration


【解决方案1】:

您选择了一个难题。最好告诉输入 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。谁来说什么是什么?

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

【讨论】:

  • 最好的部分?要翻译的字符串以SOZ 开头
猜你喜欢
  • 2010-09-13
  • 2011-07-05
  • 2018-11-19
  • 2018-11-18
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2015-03-29
  • 2010-12-09
相关资源
最近更新 更多