2012-08-16 124 views
0

我有字符串Mühle保存爲Mü¼hle在utf8數據庫。我希望它是UTF8,所以它會在我的網頁上正確顯示,它也使用utf8。如何將未知字符集轉換爲utf8?

我認爲這個字符串沒有被轉換成utf8 befor把它寫入數據庫,現在它不能正常顯示在我的網頁上。

我試圖從我的mysql數據庫中選擇這個字符串,並將其轉換爲utf8,但它沒有工作。我也嘗試多次解碼,但也沒有奏效。見我用的是下面的代碼:

$string = Mühle; 
$string=utf8_encode($string); 
echo $string; 

$string = Mühle; 
$string=utf8_decode($string); 
$string=utf8_encode($string); 
echo $string; 

上述代碼的輸出是一樣的在兩種情況下的輸入,不改變對字符串什麼。

我能做些什麼來轉換這個字符串,以便我可以在我的mysql數據庫中更新它,並在下次選擇它時將它正確顯示爲Mühle?

+0

您確定原始輸入內容正確嗎?因爲當你將'Mühle'從latin1轉換爲utf8時,結果是'Mühle'。 – 2012-08-16 17:44:37

回答

2

您的字符串是雙重編碼 UTF-8 - 即UTF-8被解釋爲Latin-1,然後重新編碼爲UTF-8。

當你搞亂你的字符編碼時會發生這種情況 - 例如,當你發送UTF-8數據的時候你的MySQL期望連接使用Latin-1。爲了解決這個問題,您需要在創建連接後立即調用mysqli_set_charset(或數據庫API的等效函數),或者默認修改MySQL配置以使用UTF-8連接。此外,您將需要修復您的數據 - 這是通過使用utf8_decode適當的次數來完成的。如果「Mü¼hle」是數據庫以UTF-8連接返回的確切字節,則需要讀取該字符串,通過utf8_decode發送,然後更新該行(仍使用UTF-8連接)。

請注意,當您在MySQL中選擇一行時,將在發送回客戶端之前從表字符集轉換爲連接字符集。因此,如果您在屏幕上看到「Mü¼hle」,MySQL將使用UTF-8連接,顯示的字符串爲UTF-8,則需要調用utf8_decode 兩次以修復它,因爲這意味着該字符串實際上是三重編碼的 - 在數據庫文本中是兩次,並且一次用於顯示。 仔細檢查所有內容,最好使用一個開發良好的MySQL客戶端,如phpMyAdmin - 直到它正確顯示在那裏,您的數據仍然編碼不正確

如果這只是幾行的問題,手動修復是可以的;如果這是數據庫的一般問題,那麼您可能更願意轉儲SQL腳本,將轉換成文件,然後用它來替換舊數據。

+0

謝謝邁克爾!這確實是三重編碼! – BastiaanWW 2012-08-17 08:32:44

0

請嘗試以下功能。它會將字符串轉換回UTF-8。

function convert_smart_quotes($string) 
{ 
$string = htmlentities($string); 
$string = mb_convert_encoding($string, 'HTML-ENTITIES', 'utf-8'); 
$string = htmlspecialchars_decode(utf8_decode(htmlentities($string, ENT_COMPAT, 'utf-8', false))); 

$s = array(
    chr(145) => "'", 
    chr(146) => "'", 
    chr(147) => '"', 
    chr(148) => '"', 
    chr(151) => '-', 
    's©' => '©', 
    '®' => '®', 
    '™' => '™', //™ 
    '“' => '"', // left side double smart quote 
    'â€' => '"', // right side double smart quote 
    '‘' => "'", // left side single smart quote 
    '’' => "'", // right side single smart quote 
    '…' => '...', // elipsis 
    'â€」' => '-', // em dash 
    'â€「' => '-', // en dash 
); 

return strtr($string, $s); 
}