用PHP中的“等效”ASCII替换变音字符?

时间:2010-04-16 15:20:57

标签: php character-encoding diacritics

相关问题:

  1. How to replace characters in a java String?
  2. How to replace special characters with their equivalent (such as " á " for " a") in C#?
  3. 如上所述,我正在寻找一种可靠,强大的方法,使用PHP将任何unicode字符减少到接近等效的ASCII。我真的想避免滚动我自己的查找表。

    例如(从第一个引用的问题中窃取):Gračišće变为Gracisce

4 个答案:

答案 0 :(得分:32)

iconv模块可以执行此操作,更具体地说,iconv()函数:

$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce");
echo $str;
//outputs "Gracisce"
iconv的主要麻烦在于你只需要观察你的编码,但它绝对是工作的正确工具(由于我正在使用的文本编辑器的限制,我使用'Windows-1252'作为示例;你肯定想要使用的iconv的功能是//TRANSLIT标志,它告诉iconv将任何没有ASCII匹配的字符音译成最接近的近似值。

答案 1 :(得分:2)

我的解决方案是创建两个字符串 - 首先是不需要的字母,第二个是用字母代替第一个字母。

$from = 'čšć';
$to   = 'csc';
$text = 'Gračišće';

$result = str_replace(str_split($from), str_split($to), $text);

答案 2 :(得分:2)

我找到了另一种解决方案,基于@ zombat的回答。

他回答的问题是我得到了:

Notice: iconv() [function.iconv]: Wrong charset, conversion from `UTF-8' to `ASCII//TRANSLIT//IGNORE' is not allowed in D:\www\phpcommand.php(11) : eval()'d code on line 3

从函数中删除//IGNORE后,我得到了:

Gr'a'e~a~o^O"ucisce

因此,š字符被正确翻译,但其他字符则没有。

对我有用的解决方案是preg_replace(除了[a-zA-Z0-9] - 包括空格之外的所有内容)和@ zombat的解决方案之间的混合:

preg_replace('/[^a-zA-Z0-9.]/','',iconv('UTF-8', 'ASCII//TRANSLIT', "GráéãõÔücišce"));

输出:

GraeaoOucisce

答案 3 :(得分:1)

试试这个:

function normal_chars($string)
{
    $string = htmlentities($string, ENT_QUOTES, 'UTF-8');
    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', $string);
    $string = preg_replace(array('~[^0-9a-z]~i', '~-+~'), ' ', $string);
    return trim($string);
}

Examples:

echo normal_chars('Álix----_Ãxel!?!?'); // Alix Axel
echo normal_chars('áéíóúÁÉÍÓÚ'); // aeiouAEIOU
echo normal_chars('üÿÄËÏÖÜŸåÅ'); // uyAEIOUYaA

根据此主题中选定的答案:URL Friendly Username in PHP?