2013-08-06 113 views
0

即時通訊存儲文本作爲UTF8數據庫。UTF8文本回來奇怪的符號

當後通過JS發到我的API,這樣的符號如ö回來爲「ö」作爲

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

我的API輸出與送出

我的網站的HTML聲明頭聲明UTF-8,像這樣:

$status_header = 'HTTP/1.1 '.$status.' '.self::getStatusCodeMessage($status); 
header($status_header); 
header('Content-type: ' . $content_type.'; charset=utf-8'); 

if ($body !== '') { 
    echo $body; 

我已經成功地避開這個問題的唯一方法是使用PHP在我的輸出待辦事項這樣的:

private static function fixText($text) { 

     $replaceChars = array(
      "“" => "\"", 
      '•' => '·', 
      "â€" => "\"", 
      "’" => "'", 
      'ö' => 'ö', 

      'â€' => "'", 

      "é" => "é", 
      "ë" => "ë", 
      "£" => "£" 
     ); 
     foreach($replaceChars as $oldChar => $newChar) { 
      $text = str_replace($oldChar, $newChar, $text); 
     } 

     $text = iconv("UTF-8", "UTF-8//IGNORE", $text); 
     return $text; 
    } 

顯然這並不理想,因爲我不得不在地圖上添加越來越多的符號。


UPDATE:

開發人員已經悄悄加入以下代碼:

$document->text = mb_convert_encoding($document->text, mb_detect_encoding($document->text), "cp1252"); 

,以此來克服老拉丁字符未來通過破壞。

+0

什麼是字符集和你的數據庫和表格的排序規則? –

+0

很好,你展示了你當前的解決方法,但是如果你也提供了更多關於你在做什麼的細節,那會更好。元標記和斷言你的API輸出是作爲utf-8發送的,並不值得繼續。 – Jon

+0

對不起,我正在使用mongoDB,據我所知mongoDB始終是utf-8。更新的代碼示例。 – azz0r

回答

1

看到那些有趣的字符意味着您已經存儲了雙重編碼的UTF-8。你不顯示如何將數據添加到數據庫。如果您在已經使用UTF-8編碼的字符串上使用utf8_encode(),這將是您的結果。

MongoDB只接受UTF-8,但如果您已經通過網絡服務器向您發送UTF-8,則不應再次自己對其進行編碼。

相反的:

header('Content-type: ' . $content_type.'; charset=utf-8'); 

考慮設置默認字符集在php.ini

default_charset=UTF-8