2009-08-23 132 views
2

我一直在努力获得一堆字符转换为核心utf-8存储在我的数据库。用特殊字符(html_entity_decode,iconv等)努力

PHP的iconv失败的人物众多,所以我一直在被迫建立自己的“解决方案”,这实在不是一个解决方案,如果它不工作,并在窗口几乎完全失败了,有这么发展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); 
,但我担心,我将开始搞砸了的话在那里它得到错过了特殊字符被替换。 我已经有了'墨西哥'出现'墨西哥'这样的经历,所以这是行不通的。

字符编码应该是UTF-8,虽然我已经试图改变头ISO-8859-1编码之前,或者未设置任何编码,我总是得到相同的结果。

我确定我得到的可能是这样做的最糟糕的方式,但我一直无法找到有效的解决方案。有什么建议么?我的担心是,这几乎是永无止境的,我总是在翻译的迷宫中发现新的角色。

+1

是你的实际问题,你正试图解决有关在MySQL中存储utf8编码的字符?所有音译代码似乎表明你的mysql连接字符集有问题,并且你实际上不能发送utf8字符。 – VolkerK 2009-08-23 18:22:35

+0

并非所有的代码都是关于存储utf8编码字符的,其中一些实际上是关于去除无用字符(如'★')。看来问题可能是两方面的。 eyze的回答似乎(我希望)清理了我已经剥离/替换的东西剩下的东西。不幸的是,我的服务器似乎不接受文件中的编码,因此剥离(或尝试)的字符仍未被删除。 – pedalpete 2009-08-24 14:50:26

回答

2
  1. 保存您的PHP文件为UTF-8。
  2. 连接时请执行SET NAMES'UTF8';

如果您还需要替换字符请执行下列操作:

$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

哇!这很好,很简洁。而且它的效果非常好(在我进行的有限测试中)。 虽然有一个问题,preg_replace中的htmlentites。我试图获得非HTML编码的字符。我注意到一些空格是以&nbsp出现的,并且我还有一些引用仍然以“&”和“rs”等形式出现。这仅仅是我迄今为止进行的非常有限的测试,并且删除了所有我拥有的东西最初完成。我已经完全按照您提供的方式复制了preg_replace。 – pedalpete 2009-08-23 19:42:38

+0

我刚刚编辑了我的答案,现在就试试。 – 2009-08-23 20:53:55

+0

从我对编辑的初步测试中,我发现引号存在问题。我已将它更改为htmlentities($ string,ENT_NOQUOTES,'UTF-8'),ENT_QUOTES,'UTF-8')。这似乎是好的,但我得到'''为'''。我本来期望至少能够以RSQUO的身份出现,但不幸的是不是。任何想法如何解决这个问题? – pedalpete 2009-08-23 21:52:09

1

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

我有问题西班牙特殊字符。有了这个我解决了它

+0

救救我吧!谢谢 – 2013-12-21 00:15:13