2011-12-21 93 views
0

我在latin1表中有一個字符串「Artîsté」。我使用C mysql連接器從表中獲取字符串。我將character_set_connection設置爲utf8。如何確定這是latin1還是utf8?

在它看起來像調試器:

"Art\xeest\xe9" 

如果我打印十六進制值與輸出( 「%02X」,(無符號字符)A [1]);對於每個字符我得到

41 72 74 EE 73 74 E9 

如何知道它是否是utf8或latin1?

回答

1

如喲可以以UTF-8序列的the schema看可以有2種很大的可能性:

  • 第一位= 0(同ASCII),每具有值炭1個字節< = 0x7F的
  • 第一位= 1 UTF-8序列的,序列長度爲> =具有值2個字節> = 0x80的

這是異8859編碼

41 72 74 *EE* 73 74 *E9* 
單獨

只有2架同值字節> = 0x80的

ADD當心

要當心!即使您發現格式正確的UTF-8序列,您也無法區分它與ISO-8859字符組合!

+0

你說2個單字節,UTF8最多可以有4個?這是否像EEEE(4字節)? – joels 2011-12-21 20:37:49

+0

對不起,不好的選擇,比我更正。第一個字節EE第二個字節E9但彼此分開 – 2011-12-21 20:52:15

4

\x74\xee\x73不是有效的UTF-8序列,因爲UTF-8在設置最高位時永遠不會運行只有1個字節。所以在這兩者中,它必須是Latin-1。但是,如果您看到的字節是有效的UTF-8數據,那麼並不總是可以排除它可能是Latin-1,而這恰好也是有效的UTF-8。

的Latin-1確實有一些無效字節(ASCII控制字符0x00-0x1F和未使用的範圍0x7f-0x9F),所以有一些UTF-8字符串,你可以肯定不是Latin-1的。但根據我的經驗,將Windows CP1252錯誤地標記爲Latin-1已經很普遍,拒絕所有這些代碼點是相當無用的,除非您將另一個字符集轉換爲Latin-1,並且要嚴格要求什麼你輸出。 CP1252也有一些未使用的字節,但不是那麼多。