2012-08-22 10 views
5

我有一些PHP函數mb_detect_encoding的問題。 我無法將其轉換爲ISO-8859-1。任何幫助?mb_convert_encoding問題

代碼:

$str = "åäö"; 
$encoding = mb_detect_encoding($str); 
echo $encoding; 

$encoding = mb_detect_encoding(mb_convert_encoding($str, "ISO-8859-1")); 
echo $encoding; 

輸出:

UTF-8

UTF-8

更新,解決方案:

我將mb_detect_order更新爲數組('UTF-8','ISO-8859-1'),它工作。

+0

你的'mb_detect_order()'是什麼? – Passerby

+0

好吧,你走了。我在開始時將mb_detect_order更新爲UTF-8,並且它工作正常。謝謝! – brasimon

+0

如果您已經解決了您的問題,請將其作爲答案發布,並在可以時接受。 –

回答

-2

我更新mb_detect_order到陣列( 'UTF-8', 'ISO-8859-1')和它的工作

+0

你正在欺騙自己,相信轉換已經奏效。由於c3a5c3a4c3b6是UTF-8和ISO-8859-1中的有效字節字符串(表示兩種情況下的不同情況),因此可以通過mb_detect_order將其報告爲任一編碼。 – borrible

+0

@borrible如果他的'mb_internal_encoding'已經被設置爲UTF-8會怎麼樣? – Passerby

+0

@Passerby - 這與我們所看到的不一致。如果字符串實際上已被轉換爲ISO-8859-1,則它將成爲字節序列e5e4f6。現在這不是有效的UTF-8,所以mb_convert_encoding不會報告UTF-8。但是,如果序列保留爲c3a5c3a4c3b6(有效的UTF-8或ISO-8859-1),我們將得到所描述的情況。 – borrible

6

你還沒有真正轉換您的字符串。相反,對mb_convert_encoding的調用並未假定原始字符串是UTF-8。調用之前的字符串是一個可能已經是ISO-8859-1的字節序列(並且會以不同方式表示項目)。你可以看到這種情況,而不是調用mb_detect_encoding,在字符串上使用bin2hex,並在轉換調用後看到字節序列。你會看到字節序列沒有改變。

爲了讓轉換工作,您需要告訴它(在這種情況下)原始編碼。使用:

mb_convert_encoding($str, 'ISO-8859-1','utf-8'); 

如果您在此之後檢查字節序列,您將看到轉換已經發生。

+0

ISO-8859-1是否適用於無編碼「字符串」(即隨機無效字節序列)? – Pacerier