2012-11-21 35 views
4

有相同的Unicode(標準化)table不同的編碼。例如,對於UTF-8編碼Acorresponds to0x0041但對於UTF-16編碼相同Arepresented as0xfeff0041Windows使用Unicode數據類型的Unicode編碼(UTF-8,UTF-16,其他)

從這個brilliant article我瞭解到,當我用C++的Windows平臺的計劃,我處理Unicode的,我應該知道,這是在2個字節表示。但它沒有提到任何有關編碼的內容。 (即使它說x86 CPU是小端的,所以我知道這兩個字節是如何存儲在內存中的。)但是我也應該知道Unicode的編碼,以便我有關於符號如何存儲在內存中的完整信息。是否有任何固定的Unicode編碼的C + +/Windows程序員?

+8

'A'不**代表UTF-16中的'0xfeff0041'。它在UTF-8中是「0x41」,在UTF-16中是「0x0041」。 –

+0

http://www.fileformat.info/info/charset/UTF-16/list.htm這裏是我的信息的來源,正如我已經提到的。那麼它是如何存儲的? – Narek

+4

你的源碼錯誤。所有這些值都不應該在它們前面有「feff」。 '0xFEFF'被用作UTF-16 BOM。 –

回答

12

存儲在內存中的Windows值是UTF-16小端,始終。但這不是你在說的 - 你在看文件內容。 Windows本身並未指定文件的編碼,它將其留給個別應用程序。

的0xFE的0xFF的你的文件的開頭看到的是一個Byte Order Mark or BOM。它不僅表明該文件最有可能是Unicode,但它會告訴您哪種Unicode編碼的變體。

0xfe 0xff  UTF-16 big-endian 
0xff 0xfe  UTF-16 little-endian 
0xef 0xbb 0xbf UTF-8 

沒有BOM的文件應該被認爲是8位字符,除非你知道它是如何寫入的。這仍然不會告訴你,如果它是UTF-8或其他Windows字符編碼,你只需猜測。

您可以使用記事本作爲如何完成的示例。如果文件具有BOM,則記事本將讀取它並適當地處理內容。否則,您必須使用「編碼」下拉列表自己指定編碼。

編輯:Windows文檔沒有更具體的關於編碼的原因是Windows是Unicode的早期採用者,並且當時有only one encoding of 16 bits per code point。當65536個代碼點被確定爲不足時,代理對被髮明作爲擴展範圍的一種方式,UTF-16誕生了。微軟已經在使用Unicode來引用他們的編碼並且從未改變過。

+2

**「存儲在Windows內存中的值始終是UTF-16 little-endian。」**這就是我需要的!非常感謝!只是我想知道它是否記錄在某個地方? – Narek

+0

@Narek,這裏有一個參考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd374081(v=vs.85).aspx。 Quote:「通常,一個Windows應用程序應該在內部使用UTF-16,只能在必須使用其他格式的界面上作爲」薄層「的一部分進行轉換。」它的小端並不是由Windows指定的,而是它是一個小端英特爾處理器的事實。 –

+0

謝謝馬克,這真的很有幫助! – Narek