簡體   English   中英

如何將未知的字符集轉換為utf8?

[英]How to convert unkown character set into utf8?

我在utf8數據庫中將字符串Mühle保存為Mülele。 我希望它在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時選擇它?

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

當您搞亂角色編碼時會發生這種情況 - 例如,當您希望連接使用Latin-1時發送UTF-8數據時。 要解決此問題,您需要在創建連接后立即調用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 兩次才能修復它,因為這意味着該字符串實際上是三重編碼的 - 在數據庫文本中兩次,一次用於顯示。 仔細檢查所有內容 ,最好使用像phpMyAdmin這樣開發良好的MySQL客戶端 - 直到它在那里正確顯示, 你的數據仍然編碼不正確

如果這只是幾行的問題,手動修復是可以的; 如果這是數據庫的一般問題,您可能更喜歡轉儲SQL腳本,轉換文件,並使用它來替換舊數據。

嘗試以下功能。 它會將字符串轉換回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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM