2009-08-23 133 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