挣扎于特殊字符(html_entity_decode,iconv等)

时间:2009-08-23 18:07:46

标签: php mysql character-encoding

我一直在努力将一堆字符翻译成核心utf-8,以便将它们存储在我的数据库中。

PHP iconv在很多角色上都失败了,所以我被迫建立了自己的“解决方案”,如果它不起作用,这真的不是解决方案,而且它在Windows中几乎完全失败,所以用iconv开发因为我必须在测试服务器上“开发”,所以大部分都没有结果。此外,由于iconv错过了大量的角色,它根本不是很有帮助。

这就是我的功能

function replace_accents($string) { 
  return str_replace( array('à','á','â','ã','ä', 'ç', 'è','é','ê','ë', 'ì','í','î','ï', 'ñ', 'ò','ó','ô','õ','ö', 'ù','ú','û','ü', 'ý','ÿ', 'À','Á','Â','Ã','Ä', 'Ç', 'È','É','Ê','Ë', 'Ì','Í','Î','Ï', 'Ñ', 'Ò','Ó','Ô','Õ','Ö', 'Ù','Ú','Û','Ü', 'Ý'), array('a','a','a','a','a', 'c', 'e','e','e','e', 'i','i','i','i', 'n', 'o','o','o','o','o', 'u','u','u','u', 'y','y', 'A','A','A','A','A', 'C', 'E','E','E','E', 'I','I','I','I', 'N', 'O','O','O','O','O', 'U','U','U','U', 'Y'), $string); 
} 


function replaceQuote($string){
$replaceQuote=array('‘', '’', '“', '”', ''','‚','„',''',"’");
    return str_replace($replaceQuote,'\'', $string);
}

function replaceArray($string){
$replaceArray=array('—', '™','™','™','©', '®', '®','©',
                    '¡',
                    '¡',
                    '¢',
                    '¢',
                    '£',
                    '£',
                    '¤',
                    '¥',
                    '¥',
                '¦',
            '§',
                '§',
            '«',
            '«',
            '¬',
            '¬',
            '­',
            '¯',
            '¯',
        '²',
            '³',
            'µ',
            'µ',
            '¶',
            '¶',
            '·',
            '·',
            '¸',
            '¸',
            '¹',
        'º',
        'º','»',  '‹', '»','¼', '½','¾','♥', '☆', '☠', '░','▒','▓','█', '★',
'♪','♫','◄','▀','▄','►', '¤', '^', '☣', '…', '†', '‡', '.:','♣','Ξ','ξ','↠','⇒','→','↞','⇐','←',
'⇔','↔','™','♠','&loz','√','∩','&Cap','∴');
  return str_replace($replaceArray, '', $string);
  }

function special_replace($string){
   $replace_from=array('ƒ', 'Œ','œ','•', '–', '—','˜','š','Š','Ÿ','ÿ','ε',
   '€','α','Α','τ','Τ','θ','Θ');

   $replace_to=array('ƒ', 'Œ','œ','•','-','-','~','š','Š','Ÿ','ÿ','ε','€','α','Α','τ','Τ','θ','Θ');
 return str_replace($replace_from, $replace_to, $string);


}

function dbSlug($slugIt){
$slugIt=html_entity_decode($slugIt);

$slugIt=replaceArray($slugIt);
$slugIt=replaceQuote($slugIt);
$slugIt=special_replace($slugIt);

//$slugIt=iconv('ISO-8859-1', 'UTF-8//TRANSLIT//IGNORE', $slugIt);
$slugIt=replace_accents($slugIt);
$slugIt=trim($slugIt);
        return $slugIt;

    }

由于我有时在多个替换函数中使用相同的字符,但是我可能看起来效率不高,但是我在不同的方式使用多个函数,所以这就是为什么我可能在多个替换函数中使用相同的字符。

现在,问题在于,每当我去查看数据时,我都会发现另一个特殊的角色,这个角色并没有通过我的迷宫找到并替换/移除角色。

目前令人反感的角色是你认为会相当无害的''。 最终在数据库中以''结尾。并非所有的空间都在关注你,它似乎只影响一些空间(我还没弄清楚为什么)。

我已经待了一个多星期了,每次回去看看,我都有更多的东西要加上'修复'。

我不是在问如何删除'Â',我希望得到一个解决方案,如何保持内容/数据的完整性,但没有特殊的字符,有时在移动数据时会搞砸,并保持可搜索性。

我会做

preg_replace("/[^a-zA-Z0-9,-\'-!&.etc]/", "", $data);
,但我担心我会开始搞砸那些错过的特殊角色被取代的单词。 我已经有过“México”出现'Mxico'的经历,所以这样做不行。

字符编码应该是UTF-8,虽然我在编码之前尝试将标题更改为ISO-8859-1,或者没有设置任何编码,但我总是得到相同的结果。

我确信我所拥有的可能是最糟糕的方式,但我找不到有效的解决方案。有什么建议?我担心的是,这几乎永无止境,而且我总是通过我的翻译迷宫找到新的角色。

2 个答案:

答案 0 :(得分:2)

  1. 将您的PHP文件保存为UTF-8。
  2. 连接后,请执行SET NAMES'UTF8';
  3. 如果您仍需要替换字符,请执行以下操作:

    $string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));
    

    修改

    $string = html_entity_decode(preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8')), ENT_COMPAT, 'UTF-8');
    

答案 1 :(得分:1)

你可以使用,html_entity_decode($ strint,ENT_QUOTES,'UTF-8')

我遇到西班牙语特殊字符的问题。有了这个,我解决了它