【问题标题】:Convert accented characters to their plain ascii equivalents将重音字符转换为其纯 ascii 等价物
【发布时间】:2012-04-07 13:17:13
【问题描述】:

我必须在我的 php 中将法语字符转换为英语。我使用了以下代码:

iconv("utf-8", "ascii//TRANSLIT", $string);

但是ËËË 的结果是"E"E"E

我不需要双引号和其他额外字符 - 我想显示像 EEE 这样的输出。有没有其他方法可以将法语转换为英语?你能帮我做这件事吗?

【问题讨论】:

  • 您可以保留 utf-8 编码并维护重音字符到英文字母的映射。
  • 好问题!如果通过iconv("utf-8", "ascii//TRANSLIT",)从utf8转换中欧字符(iso-8859-2),无论设置各种setlocale(),我都会遇到同样的问题。 iconv("iso-8859-2",..)从iso-8859-2转换时,问题不存在!!
  • @bdares,听起来有点像重新发明轮子;这是我最后的可能性。我觉得应该(并且可能是)更系统的解决方案来解决“去重音”
  • 我用过 utf8_decode($str)。它给我看 ��.and 用 utf8_encode($str)它给我看 ÃÃÃ.任何想法?
  • 为什么?这有 99% 的可能性是错误的。你不能用这种方式“把法语转换成英语”!!!

标签: php utf-8 character-encoding locale diacritics


【解决方案1】:

这里是wordpress的方式:

http://codex.wordpress.org/Function_Reference/remove_accents

您可以复制 remove_accents() 函数并实施到您的系统中。

https://core.trac.wordpress.org/browser/tags/3.9.1/src/wp-includes/formatting.php#L682

【讨论】:

  • “你可以复制 remove_accents() 函数...” 我通过大致复制/粘贴wordpress函数创建了一个包:github.com/rap2hpoutre/convert-accent-characters希望它可以帮助!
  • @rap-2-h Wordpress 已获得 GPL 许可,如果我错了请纠正我,但您的软件包也应该具有相同的许可。
  • 你可以从链接打开文件,当你滚动足够多时撕掉他们的字符图......
【解决方案2】:

这对我来说适用于法语字符。

$str = utf8_encode($str);
$str = iconv('UTF-8', 'ASCII//TRANSLIT', $str);

【讨论】:

  • 其实在Windows和Linux上的结果是不一样的。
  • 当我尝试用?替换爱尔兰字符,例如Í...这些和法语字符有区别吗?
  • 其实第一行将字符转换为Ã,然后第二行将Ã转换为??:/
  • 这为我修复了问号和引号setlocale(LC_ALL, "en_US.utf8"); $string = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $string);
【解决方案3】:

另一种选择:

function replaceAccents($str) {

  $search = explode(",","ç,æ,œ,á,é,í,ó,ú,à,è,ì,ò,ù,ä,ë,ï,ö,ü,ÿ,â,ê,î,ô,û,å,ø,Ø,Å,Á,À,Â,Ä,È,É,Ê,Ë,Í,Î,Ï,Ì,Ò,Ó,Ô,Ö,Ú,Ù,Û,Ü,Ÿ,Ç,Æ,Œ");

  $replace = explode(",","c,ae,oe,a,e,i,o,u,a,e,i,o,u,a,e,i,o,u,y,a,e,i,o,u,a,o,O,A,A,A,A,A,E,E,E,E,I,I,I,I,O,O,O,O,U,U,U,U,Y,C,AE,OE");

  return str_replace($search, $replace, $str);
}


$str = "À é ü ä ç";
$str = replaceAccents($str);
echo "$str \n"; 
//output "A e u a c" 

【讨论】:

    【解决方案4】:

    PHP Manual iconv Intro 有一个警告:

    请注意,某些系统上的 iconv 功能可能无法像您一样工作 预计。在这种情况下,最好安装 GNU libiconv 图书馆。它很可能最终会得到更一致的结果。

    但如果重音字符是唯一的问题,那么您可以使用脏 strtr(部分来自 strtr comments):

    $string = 'Ë À Ì Â Í Ã Î Ä Ï Ç Ò È Ó É Ô Ê Õ Ö ê Ù ë Ú î Û ï Ü ô Ý õ â û ã ÿ ç';
    
    $normalizeChars = array(
        'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',
        'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I',
        'Ï'=>'I', 'Ñ'=>'N', 'Ń'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',
        'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a',
        'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i',
        'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ń'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u',
        'ú'=>'u', 'û'=>'u', 'ü'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f',
        'ă'=>'a', 'î'=>'i', 'â'=>'a', 'ș'=>'s', 'ț'=>'t', 'Ă'=>'A', 'Î'=>'I', 'Â'=>'A', 'Ș'=>'S', 'Ț'=>'T',
    );
    
    //Output: E A I A I A I A I C O E O E O E O O e U e U i U i U o Y o a u a y c
    echo strtr($string, $normalizeChars);
    

    【讨论】:

    • 如果我从 html 表单(ex:ÉÉÉabcd) 得到我的字符串并使用,$this->_data = JRequest::get('post'); $string=$this->_data['quiz_optionA'];然后使用该转换方法,结果是 A.A.A.abcd..法语字符没有被转换为字符串。输出应该是 EEEabcd.U 有什么想法吗?
    • ÉÉÉabcd.这是我的字符串,来自表单,使用 post 方法。
    • 这一行之后? $string=$this->_data['quiz_optionA']; 如果您只是尝试按原样输出字符串,它会破坏重音字符吗?
    • 它很脏,但它可以工作......至少在转换爱尔兰名字时对我来说!
    • 缺少 'ń' => 'n'
    【解决方案5】:

    在 laravel 中,你可以简单地使用 str_slug($accentedPhrase),如果你关心破折号 (-) 用空格代替,你可以使用 str_replace('-', ' ', str_slug($accentedPhrase))

    【讨论】:

    • str_slug 还支持$separator 参数,因此您可以使用str_slug($accentedPhrase, ' ') 作为快捷方式
    【解决方案6】:

    这对我有帮助。将语言环境设置为 en_US 而不是您的真实语言环境非常重要。

    $curLocale = setlocale(LC_ALL, 0); //gets current locale
    setlocale(LC_ALL, "en_US.utf8"); //without this iconv removes accented letters. If you use another locale it will also fail
    
    $text = iconv('UTF-8', 'ASCII//TRANSLIT', $text);
    
    setlocale(LC_ALL, $curLocale); //set locale to what it was before   
    

    【讨论】:

      【解决方案7】:

      在这种情况下对我有用的是在字符串上使用 utf8_encode,然后在编码后使用 strtr() 函数。

      即。

      $normalizeChars = array(
                  'Š'=>'S', 'š'=>'s', 'Ð'=>'Dj','Ž'=>'Z', 'ž'=>'z', 'À'=>'A', 'Á'=>'A', 'Â'=>'A', 'Ã'=>'A', 'Ä'=>'A',
                  'Å'=>'A', 'Æ'=>'A', 'Ç'=>'C', 'È'=>'E', 'É'=>'E', 'Ê'=>'E', 'Ë'=>'E', 'Ì'=>'I', 'Í'=>'I', 'Î'=>'I',
                  'Ï'=>'I', 'Ñ'=>'N', 'Ń'=>'N', 'Ò'=>'O', 'Ó'=>'O', 'Ô'=>'O', 'Õ'=>'O', 'Ö'=>'O', 'Ø'=>'O', 'Ù'=>'U', 'Ú'=>'U',
                  'Û'=>'U', 'Ü'=>'U', 'Ý'=>'Y', 'Þ'=>'B', 'ß'=>'Ss','à'=>'a', 'á'=>'a', 'â'=>'a', 'ã'=>'a', 'ä'=>'a',
                  'å'=>'a', 'æ'=>'a', 'ç'=>'c', 'è'=>'e', 'é'=>'e', 'ê'=>'e', 'ë'=>'e', 'ì'=>'i', 'í'=>'i', 'î'=>'i',
                  'ï'=>'i', 'ð'=>'o', 'ñ'=>'n', 'ń'=>'n', 'ò'=>'o', 'ó'=>'o', 'ô'=>'o', 'õ'=>'o', 'ö'=>'o', 'ø'=>'o', 'ù'=>'u',
                  'ú'=>'u', 'û'=>'u', 'ü'=>'u', 'ý'=>'y', 'ý'=>'y', 'þ'=>'b', 'ÿ'=>'y', 'ƒ'=>'f',
                  'ă'=>'a', 'î'=>'i', 'â'=>'a', 'ș'=>'s', 'ț'=>'t', 'Ă'=>'A', 'Î'=>'I', 'Â'=>'A', 'Ș'=>'S', 'Ț'=>'T',
              );
      
      $legal_name = utf8_encode($res['LEGAL_NAME']);
      $res['LEGAL_NAME'] = strtr($legal_name, $normalizeChars);
      

      输出 = Burelle Amélie -> Burelle Amelie

      【讨论】:

        【解决方案8】:

        只是把这里作为替代(本质上有点复杂),wordpress 使用这个功能来去除重音。在下面进行了一些更改,使其在不引用 wordpress 函数的情况下独立运行。

             function mbstring_binary_safe_encoding($reset = false)
        {
            static $encodings  = array();
            static $overloaded = null;
        
            if (is_null($overloaded)) {
                $overloaded = function_exists('mb_internal_encoding') && (ini_get('mbstring.func_overload') & 2);
            }
        
            if (false === $overloaded) {
                return;
            }
        
            if (!$reset) {
                $encoding = mb_internal_encoding();
                array_push($encodings, $encoding);
                mb_internal_encoding('ISO-8859-1');
            }
        
            if ($reset && $encodings) {
                $encoding = array_pop($encodings);
                mb_internal_encoding($encoding);
            }
        }
        
        function seems_utf8($str)
        {
            mbstring_binary_safe_encoding();
            $length = strlen($str);
            mbstring_binary_safe_encoding(true);
            for ($i = 0; $i < $length; $i++) {
                $c = ord($str[$i]);
                if ($c < 0x80) {
                    $n = 0;
                }
                // 0bbbbbbb
                elseif (($c & 0xE0) == 0xC0) {
                    $n = 1;
                }
                // 110bbbbb
                elseif (($c & 0xF0) == 0xE0) {
                    $n = 2;
                }
                // 1110bbbb
                elseif (($c & 0xF8) == 0xF0) {
                    $n = 3;
                }
                // 11110bbb
                elseif (($c & 0xFC) == 0xF8) {
                    $n = 4;
                }
                // 111110bb
                elseif (($c & 0xFE) == 0xFC) {
                    $n = 5;
                }
                // 1111110b
                else {
                        return false;
                    }
                    // Does not match any model
                    for ($j = 0; $j < $n; $j++) {
                        // n bytes matching 10bbbbbb follow ?
                        if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80)) {
                            return false;
                        }
        
                    }
                }
                return true;
            }
        
            function remove_accents($string)
        {
                if (!preg_match('/[\x80-\xff]/', $string)) {
                    return $string;
                }
        
                if (seems_utf8($string)) {
                    $chars = array(
                        // Decompositions for Latin-1 Supplement
                        'ª' => 'a', 'º'  => 'o',
                        'À' => 'A', 'Á'  => 'A',
                        'Â' => 'A', 'Ã'  => 'A',
                        'Ä' => 'A', 'Å'  => 'A',
                        'Æ' => 'AE', 'Ç' => 'C',
                        'È' => 'E', 'É'  => 'E',
                        'Ê' => 'E', 'Ë'  => 'E',
                        'Ì' => 'I', 'Í'  => 'I',
                        'Î' => 'I', 'Ï'  => 'I',
                        'Ð' => 'D', 'Ñ'  => 'N',
                        'Ò' => 'O', 'Ó'  => 'O',
                        'Ô' => 'O', 'Õ'  => 'O',
                        'Ö' => 'O', 'Ù'  => 'U',
                        'Ú' => 'U', 'Û'  => 'U',
                        'Ü' => 'U', 'Ý'  => 'Y',
                        'Þ' => 'TH', 'ß' => 's',
                        'à' => 'a', 'á'  => 'a',
                        'â' => 'a', 'ã'  => 'a',
                        'ä' => 'a', 'å'  => 'a',
                        'æ' => 'ae', 'ç' => 'c',
                        'è' => 'e', 'é'  => 'e',
                        'ê' => 'e', 'ë'  => 'e',
                        'ì' => 'i', 'í'  => 'i',
                        'î' => 'i', 'ï'  => 'i',
                        'ð' => 'd', 'ñ'  => 'n',
                        'ò' => 'o', 'ó'  => 'o',
                        'ô' => 'o', 'õ'  => 'o',
                        'ö' => 'o', 'ø'  => 'o',
                        'ù' => 'u', 'ú'  => 'u',
                        'û' => 'u', 'ü'  => 'u',
                        'ý' => 'y', 'þ'  => 'th',
                        'ÿ' => 'y', 'Ø'  => 'O',
                        // Decompositions for Latin Extended-A
                        'Ā' => 'A', 'ā'  => 'a',
                        'Ă' => 'A', 'ă'  => 'a',
                        'Ą' => 'A', 'ą'  => 'a',
                        'Ć' => 'C', 'ć'  => 'c',
                        'Ĉ' => 'C', 'ĉ'  => 'c',
                        'Ċ' => 'C', 'ċ'  => 'c',
                        'Č' => 'C', 'č'  => 'c',
                        'Ď' => 'D', 'ď'  => 'd',
                        'Đ' => 'D', 'đ'  => 'd',
                        'Ē' => 'E', 'ē'  => 'e',
                        'Ĕ' => 'E', 'ĕ'  => 'e',
                        'Ė' => 'E', 'ė'  => 'e',
                        'Ę' => 'E', 'ę'  => 'e',
                        'Ě' => 'E', 'ě'  => 'e',
                        'Ĝ' => 'G', 'ĝ'  => 'g',
                        'Ğ' => 'G', 'ğ'  => 'g',
                        'Ġ' => 'G', 'ġ'  => 'g',
                        'Ģ' => 'G', 'ģ'  => 'g',
                        'Ĥ' => 'H', 'ĥ'  => 'h',
                        'Ħ' => 'H', 'ħ'  => 'h',
                        'Ĩ' => 'I', 'ĩ'  => 'i',
                        'Ī' => 'I', 'ī'  => 'i',
                        'Ĭ' => 'I', 'ĭ'  => 'i',
                        'Į' => 'I', 'į'  => 'i',
                        'İ' => 'I', 'ı'  => 'i',
                        'IJ' => 'IJ', 'ij' => 'ij',
                        'Ĵ' => 'J', 'ĵ'  => 'j',
                        'Ķ' => 'K', 'ķ'  => 'k',
                        'ĸ' => 'k', 'Ĺ'  => 'L',
                        'ĺ' => 'l', 'Ļ'  => 'L',
                        'ļ' => 'l', 'Ľ'  => 'L',
                        'ľ' => 'l', 'Ŀ'  => 'L',
                        'ŀ' => 'l', 'Ł'  => 'L',
                        'ł' => 'l', 'Ń'  => 'N',
                        'ń' => 'n', 'Ņ'  => 'N',
                        'ņ' => 'n', 'Ň'  => 'N',
                        'ň' => 'n', 'ʼn'  => 'n',
                        'Ŋ' => 'N', 'ŋ'  => 'n',
                        'Ō' => 'O', 'ō'  => 'o',
                        'Ŏ' => 'O', 'ŏ'  => 'o',
                        'Ő' => 'O', 'ő'  => 'o',
                        'Œ' => 'OE', 'œ' => 'oe',
                        'Ŕ' => 'R', 'ŕ'  => 'r',
                        'Ŗ' => 'R', 'ŗ'  => 'r',
                        'Ř' => 'R', 'ř'  => 'r',
                        'Ś' => 'S', 'ś'  => 's',
                        'Ŝ' => 'S', 'ŝ'  => 's',
                        'Ş' => 'S', 'ş'  => 's',
                        'Š' => 'S', 'š'  => 's',
                        'Ţ' => 'T', 'ţ'  => 't',
                        'Ť' => 'T', 'ť'  => 't',
                        'Ŧ' => 'T', 'ŧ'  => 't',
                        'Ũ' => 'U', 'ũ'  => 'u',
                        'Ū' => 'U', 'ū'  => 'u',
                        'Ŭ' => 'U', 'ŭ'  => 'u',
                        'Ů' => 'U', 'ů'  => 'u',
                        'Ű' => 'U', 'ű'  => 'u',
                        'Ų' => 'U', 'ų'  => 'u',
                        'Ŵ' => 'W', 'ŵ'  => 'w',
                        'Ŷ' => 'Y', 'ŷ'  => 'y',
                        'Ÿ' => 'Y', 'Ź'  => 'Z',
                        'ź' => 'z', 'Ż'  => 'Z',
                        'ż' => 'z', 'Ž'  => 'Z',
                        'ž' => 'z', 'ſ'  => 's',
                        // Decompositions for Latin Extended-B
                        'Ș' => 'S', 'ș'  => 's',
                        'Ț' => 'T', 'ț'  => 't',
                        // Euro Sign
                        '€' => 'E',
                        // GBP (Pound) Sign
                        '£' => '',
                        // Vowels with diacritic (Vietnamese)
                        // unmarked
                        'Ơ' => 'O', 'ơ'  => 'o',
                        'Ư' => 'U', 'ư'  => 'u',
                        // grave accent
                        'Ầ' => 'A', 'ầ'  => 'a',
                        'Ằ' => 'A', 'ằ'  => 'a',
                        'Ề' => 'E', 'ề'  => 'e',
                        'Ồ' => 'O', 'ồ'  => 'o',
                        'Ờ' => 'O', 'ờ'  => 'o',
                        'Ừ' => 'U', 'ừ'  => 'u',
                        'Ỳ' => 'Y', 'ỳ'  => 'y',
                        // hook
                        'Ả' => 'A', 'ả'  => 'a',
                        'Ẩ' => 'A', 'ẩ'  => 'a',
                        'Ẳ' => 'A', 'ẳ'  => 'a',
                        'Ẻ' => 'E', 'ẻ'  => 'e',
                        'Ể' => 'E', 'ể'  => 'e',
                        'Ỉ' => 'I', 'ỉ'  => 'i',
                        'Ỏ' => 'O', 'ỏ'  => 'o',
                        'Ổ' => 'O', 'ổ'  => 'o',
                        'Ở' => 'O', 'ở'  => 'o',
                        'Ủ' => 'U', 'ủ'  => 'u',
                        'Ử' => 'U', 'ử'  => 'u',
                        'Ỷ' => 'Y', 'ỷ'  => 'y',
                        // tilde
                        'Ẫ' => 'A', 'ẫ'  => 'a',
                        'Ẵ' => 'A', 'ẵ'  => 'a',
                        'Ẽ' => 'E', 'ẽ'  => 'e',
                        'Ễ' => 'E', 'ễ'  => 'e',
                        'Ỗ' => 'O', 'ỗ'  => 'o',
                        'Ỡ' => 'O', 'ỡ'  => 'o',
                        'Ữ' => 'U', 'ữ'  => 'u',
                        'Ỹ' => 'Y', 'ỹ'  => 'y',
                        // acute accent
                        'Ấ' => 'A', 'ấ'  => 'a',
                        'Ắ' => 'A', 'ắ'  => 'a',
                        'Ế' => 'E', 'ế'  => 'e',
                        'Ố' => 'O', 'ố'  => 'o',
                        'Ớ' => 'O', 'ớ'  => 'o',
                        'Ứ' => 'U', 'ứ'  => 'u',
                        // dot below
                        'Ạ' => 'A', 'ạ'  => 'a',
                        'Ậ' => 'A', 'ậ'  => 'a',
                        'Ặ' => 'A', 'ặ'  => 'a',
                        'Ẹ' => 'E', 'ẹ'  => 'e',
                        'Ệ' => 'E', 'ệ'  => 'e',
                        'Ị' => 'I', 'ị'  => 'i',
                        'Ọ' => 'O', 'ọ'  => 'o',
                        'Ộ' => 'O', 'ộ'  => 'o',
                        'Ợ' => 'O', 'ợ'  => 'o',
                        'Ụ' => 'U', 'ụ'  => 'u',
                        'Ự' => 'U', 'ự'  => 'u',
                        'Ỵ' => 'Y', 'ỵ'  => 'y',
                        // Vowels with diacritic (Chinese, Hanyu Pinyin)
                        'ɑ' => 'a',
                        // macron
                        'Ǖ' => 'U', 'ǖ'  => 'u',
                        // acute accent
                        'Ǘ' => 'U', 'ǘ'  => 'u',
                        // caron
                        'Ǎ' => 'A', 'ǎ'  => 'a',
                        'Ǐ' => 'I', 'ǐ'  => 'i',
                        'Ǒ' => 'O', 'ǒ'  => 'o',
                        'Ǔ' => 'U', 'ǔ'  => 'u',
                        'Ǚ' => 'U', 'ǚ'  => 'u',
                        // grave accent
                        'Ǜ' => 'U', 'ǜ'  => 'u',
                    );
        
                    $string = strtr($string, $chars);
                } else {
                    $chars = array();
                    // Assume ISO-8859-1 if not UTF-8
                    $chars['in'] = "\x80\x83\x8a\x8e\x9a\x9e"
                        . "\x9f\xa2\xa5\xb5\xc0\xc1\xc2"
                        . "\xc3\xc4\xc5\xc7\xc8\xc9\xca"
                        . "\xcb\xcc\xcd\xce\xcf\xd1\xd2"
                        . "\xd3\xd4\xd5\xd6\xd8\xd9\xda"
                        . "\xdb\xdc\xdd\xe0\xe1\xe2\xe3"
                        . "\xe4\xe5\xe7\xe8\xe9\xea\xeb"
                        . "\xec\xed\xee\xef\xf1\xf2\xf3"
                        . "\xf4\xf5\xf6\xf8\xf9\xfa\xfb"
                        . "\xfc\xfd\xff";
        
                    $chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
        
                    $string              = strtr($string, $chars['in'], $chars['out']);
                    $double_chars        = array();
                    $double_chars['in']  = array("\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe");
                    $double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
                    $string              = str_replace($double_chars['in'], $double_chars['out'], $string);
                }
        
                return $string;
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-13
          • 2016-04-29
          • 1970-01-01
          • 2019-09-07
          • 1970-01-01
          • 2012-12-16
          • 2012-11-16
          • 1970-01-01
          相关资源
          最近更新 更多