2011-09-23 94 views
5

給定一個指向字節數組(字符串)的指針形式的字符串,我如何檢測C/C++中的字符串編碼(我用過visual studio 2008)? ?我做了一個搜索,但大多數樣本都是用C#完成的。在C/C++中檢測字符串的編碼

感謝

+0

這只是ANSI vs UCS2? –

+0

您期望的可能編碼是什麼?是否有可能的小集合,或者它可能只是一個? –

+0

你在使用什麼環境?我認爲在Linux下有一個可以移植到Windows的庫。 –

回答

6

假設你知道輸入數組的長度,你可以做如下的猜測:

  1. 首先,請檢查前幾個字節匹配任何衆所周知byte order marks (BOM) for Unicode。如果他們這樣做,你就完成了!
  2. 接下來,在最後一個字節前搜索'\ 0'。如果你找到一個,你可能正在處理UTF-16或UTF-32。如果你發現多個連續的'\ 0',它可能是UTF-32。
  3. 如果有任何字符從0x800xff,它當然不是ASCII或UTF-7。如果您將輸入限制爲某種Unicode的變體,則可以將其假定爲UTF-8。否則,你必須做一些猜測,以確定它是哪個multi-byte character set。那不會很有趣。
  4. 此時它可以是:ASCII,UTF-7,Base64或者UTF-16或UTF-32的範圍,它們恰好不使用最高位,也沒有任何空字符。
3

這不是容易解決的問題,通常依賴於啓發式採取在輸入的編碼是什麼的最佳猜測,這可以通過相對無害的輸入被絆倒了 - 比如,看看this Wikipedia articleThe Notepad file encoding Redux瞭解更多詳情。

如果您正在尋找一個只依賴最少的Windows解決方案,可以使用IsTextUnicode和MLang的DetectInputCodePage組合來查看字符集檢測。

如果您正在尋找便攜性,但不介意以ICU的形式承擔相當大的依賴性,那麼您可以利用它的character set detection例程以便攜方式實現相同的功能。