16

相关问题:

  1. 如何替换java字符串中的字符?
  2. 如何在 C# 中将特殊字符替换为等价字符(例如“á”代表“a”)?

与上述问题一样,我正在寻找一种可靠、强大的方法来使用 PHP 将任何 unicode 字符减少为接近等效的 ASCII。我真的很想避免滚动自己的查找表。

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

4

4 回答 4

35

iconv模块可以做到这一点,更具体地说,iconv()函数:

$str = iconv('Windows-1252', 'ASCII//TRANSLIT//IGNORE', "Gracišce");
echo $str;
//outputs "Gracisce"

iconv 的主要麻烦是你只需要观察你的编码,但它绝对是适合这项工作的工具(由于我使用的文本编辑器的限制,我在示例中使用了“Windows-1252”;)您肯定要使用的 iconv 是//TRANSLIT标志,它告诉 iconv 将任何没有 ASCII 匹配的字符音译为最接近的近似值。

于 2010-04-16T15:30:06.473 回答
4

根据@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
于 2013-11-04T12:25:42.440 回答
2

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

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

$result = str_replace(str_split($from), str_split($to), $text);
于 2010-04-16T15:28:49.170 回答
2

试试这个:

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

基于此线程中选择的答案:PHP 中的 URL 友好用户名?

于 2010-04-16T15:29:25.750 回答