【问题标题】:Replace Accented Characters替换重音字符
【发布时间】:2012-10-02 19:39:38
【问题描述】:

我一直在阅读其他一些问题,但我仍然坚持将包含重音字符的字符串转换为纯字符(我的意思是 a-z)的问题

我有一个产品名称“Áhkká”,它已经编码为"Áhkká"

我想把它解码成带重音符号的字符串,然后转换成“Ahkka”

到目前为止,我已经尝试过:

function convert($name) {
   $name = html_entity_decode($name,ENT_COMPAT,"UTF-8");
   $name = iconv('UTF-8', 'ASCII//TRANSLIT', $name);
   return $name;
}

我从 iconv 收到一个错误:“检测到输入字符串中的非法字符”

我也尝试过使用 htmlspecialchars_decode($name);但这给了我“hkk”

我还发现了一个字符串替换函数来清除重音,但我似乎无法将非 html 字符串传递给它

$name = strtr($name,'àáâãäçèéêëìíîïñòóôõöùúûüýÿÀÁÂÃÄÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝ','aaaaaceeeeiiiinooooouuuuyyAAAAACEEEEIIIINOOOOOUUUUY');

有人可以提供解决方案吗?服务器正在运行 PHP 5.2.13。 iconv 已启用 glibc 2.5(输入/内部/输出编码在 phpinfo 中为 ISO-8859-1)

【问题讨论】:

  • 我觉得不错ideone.com/UrGfn
  • I have a product name "Áhkká" which is already encoded as "Áhkká"
  • 看起来你的语法错误是因为忘记了分号:return $name;
  • @Musa - 我仍然得到?hkk?,Mahn,数据来自第 3 方(CSV 数据),所以我无法控制。 GigaWatt - 谢谢,我更新了我的问题,但这不是问题。
  • 试音后转回utf-8。

标签: php character-encoding


【解决方案1】:

试图找到解决您问题的方法我发现了这个问题:

multibyte strtr() -> mb_strtr()

在选择的答案中,Alix Axel 编写了一个正是您需要的函数:

function Unaccent($string)
{
    return preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml|caron);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'));
}

echo Unaccent(html_entity_decode('Áhkká'));

打印Ahkka

【讨论】:

  • 这看起来很有希望,但我最终以“ampaacutehkkampaacute”作为输出。我隔离了我的代码,这就是输出。我已经根据您的答案使用测试代码更新了我的答案。也许我需要设置我的默认字符集?
  • 你试过用你之前使用的参数解码html实体吗? html_entity_decode($name,ENT_COMPAT,"UTF-8"); 解码后是否得到正确的 UTF-8 字符串?如果您这样做,Unaccent 功能应该可以正常工作。
  • 对不起我的错误。您的代码确实有效,但我还需要删除 '类型条目。其次,这段代码将运行大约 400,000 次以及另外 2 个 preg_replace 以创建一个“干净”的 url - 清理一些产品 URL - 这是最快的方法吗?
  • 我已经接受了你的回答,因为它是一个解决方案,尽管最后我确实使用了 iconv(需要 setlocate);
猜你喜欢
  • 2011-03-23
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2018-10-21
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多