2013-07-17 57 views
0

我遇到了一個非常奇怪的錯誤。UTF-8字符串解碼破壞一個字符串,但不是另一個

我覈實,我的兩個字符串是UTF-8,但是當我嘗試在字符串中使用utf8_decode,將垃圾字符回到我(通過mb_check_encoding和mb_detect_encoding選中)。在這種情況下,我實際上不需要使用utf8_decode並且字符串將是正常的。

困難在於我有客戶使用UTF-8數據庫,我從中抽取字符串,並使用utf8_decode爲PHP定義字符串。如果我不把空格字符換成Ã。他們共享相同的代碼來生成字符串,但由於某種原因,當我爲其他客戶生成該字符串時,這些字符串出錯了。

有沒有一種方法可以讓我確認除了字符串是utf 8之外,我還需要使用utf8_decode?

一些例子:

Using utf8_decode for customer 1: 
?0,107�per�km 
Without utf8_decode for customer 1: 
€0,107 per km 

Using utf8_decode for customer 2: 
$7.00 per km 
Without utf8_decode for customer 2: 
$7.00 per km 

謝謝你們!

+0

如果數據庫具有不一致的編碼數據,這就難怪你會看到類似的東西。 – Jon

+0

感謝您的評論。客戶是國際化的,因此必須使用不同的編碼標準。 – infinityLoop

+1

爲什麼?我們正在談論UTF-8,它可以容納所有這些。無論如何,如果他們的數據庫出於任何原因搞砸了......我不確定這個問題會是什麼。 – Jon

回答

0

mb_detect_encoding沒有告知detect_order沒有銀彈,因爲這將表明:

$ php -r 'echo mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"));' 
UTF-8 

明顯錯誤,將其設置爲嚴格的幫助一點點:

$ php -r 'var_dump(mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"),mb_detect_order(),true));' 
bool(false) 

爲什麼是假的?好吧,讓我們來看看可能的字符集mb_detect_encoding()用途在我的配置:

$ php -r 'var_dump(mb_detect_order());' 
array(2) { 
    [0] => 
    string(5) "ASCII" 
    [1] => 
    string(5) "UTF-8" 
} 

好,保存ASCII & UTF-8,沒有其他的字符集將被檢測到。 Jon有一點:你可以將它存儲爲utf-8,並且使用正確的數據庫設置,或者甚至只在mysql中使用正確的character_set_results(我假設你使用...)連接將會執行到無論存儲方式如何,都可以將它作爲utf-8檢索到。然而,如果這不是一個選項,無論出於什麼原因,我想不出來,它是由具體到哪些字符集是可能的mb_detect_order

$ php -r 'echo mb_detect_encoding(iconv("utf-8","iso-8859-1","ë"),"ASCII,UTF-8,ISO-8859-1,JIS", true);' 
ISO-8859-1 

總之:有責任提供可能的字符集列表,如果你已經有了這方面的信息......你也許可以知道的字符集(通過連接設置,數據庫/表設置,甚至只是客戶端配置等)而不是嘗試檢測它。

相關問題