[英]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.