在Windows作業系統下,wchar_t的大小是兩個字節,其默認的編碼方式是UTF-16(Unicode的一種存儲方式)。其中,每個基本多語言平面字符佔據兩個字節,也就是一個wchar_t數組元素;每個輔助平面字符佔據四個字節,即兩個wchar_t數組元素。例如,字符「長」是基本多語言平面字符,而「卒瓦」這兩個字合在一起的那個漢字就是一個輔助平面字符(這個字符目前在Arslanbar還無法發表)。注意,如果用wcslen函數測定wchar_t字符數組的長度,數組中的每個輔助字符將會被認為是兩個字符。
為了能讓文本編輯器識別寫入的txt文件是UTF-16編碼格式,必須在文件開頭寫入兩個字節的BOM作為標記(對於UTF8則是三個字節的BOM,不過這個BOM是可寫可不寫的)。UTF-16分為大尾序和小尾序兩種格式,其BOM分別是0xFEFF和0xFFFE。在Windows和Linux系統上一般使用小尾序,而在Mac系統上則一般使用大尾序。在C++中我們可以用一個char字符數組存儲這個BOM,然後寫入txt文件的開頭。
【代碼】
wchar_t wstr[] = L"Windows作業系統內核中的字符表示為UTF-16小尾序,可以正確處理、顯示以4位元組存儲的字符。但是Windows API實際上僅能正確處理UCS-2字符,即僅以2位元組存儲的,碼位小於U+FFFF的Unicode字符。其根源是Microsoft C++語言把wchar_t數據類型定義為16比特的unsigned short,這就與一個wchar_t型變量對應一個寬字符,可以存儲一個Unicode字符的規定相矛盾。相反,Linux平台的GCC編譯器規定一個wchar_t是4位元組長度,可以存儲一個UTF-32字符,寧可浪費了很大的存儲空間。下例運行於Windows平台的C++程序可說明此點。";
char bom[] = {0xff, 0xfe}; // UTF-16小尾序的BOM
wchar_t *pStr;
FILE *fp;
fopen_s(&fp, "utf16.txt", "wb"); // 打開文件
fwrite(bom, sizeof(bom), 1, fp); // 在文件頭部寫入BOM
for (pStr = wstr; *pStr != '\0'; pStr++)
fwrite(pStr, sizeof(wchar_t), 1, fp); // 寫入字符串,不寫入末尾的\0
fclose(fp); // 關閉文件
【運行結果】
