相當有關字符集的幾個概念將在標準中提到:基本源字符集,基本執行字符集,基本執行寬字符集,執行字符集,並執行寬字符集:什麼是執行寬字符集及其編碼?
- 基本源字符集:91個圖形字符,加上空格字符,HT,VT,FF,LF(僅從ASCII中借用名稱縮寫)。
- 基本執行(wide-)字符集:基本源字符集的所有成員,加BEL,BS,CR,(wide-)NUL。
- 執行字符集以及執行寬字符集是設置基本執行字符和基本執行寬字符集的實現所定義的超集,分別。執行字符集的成員和額外成員集的值是特定於語言環境的。
我對基本源字符集,基本執行字符集和基本執行寬字符集沒有太多問題。
至於執行字符集,標準說它是實現定義的和特定於語言環境的,所以我試圖通過觀察字符串字面初始化的char數組的字節內容來獲得一些真正的意義,其值應該等於在執行字符集的字符的編碼的數值(和通用字符名稱可以映射到一個以上的字符元件由於多字節編碼):
char str[] = "Greek lowercase alpha is: \u03B1.";
看來,它幾乎總是UTF- 8在Linux上(CE B1
存儲在該希臘字母的數組中)。在Windows上,它的Windows 1252,如果系統區域設置爲英語(因爲希臘的一些錯誤值3F
存儲不可用在Windows-1252),並在Windows的其他一些編碼爲其他區域設置(例如,在CP936 A6 C1
爲中國的語言環境,E1
希臘語區域設置爲1253,分別代表這兩種編碼中的希臘小寫字母)。對於希臘字母在區域中可用的所有情況(因此可用於執行字符集),cout << str;
可以適當地打印希臘字母。一切似乎都沒問題。
但對於執行寬字符集,我不很瞭解。它在主要平臺上的確切編碼是什麼?看來,ISO-10646值的希臘小寫字母總是被存儲在wchar_t
爲類似下面的所有平臺,我想聲明的0x3B1
:
wchar_t wstr[] = L"Greek lowercase alpha is: \u03B1.";
所以我想執行廣泛的系統字符集很可能是UCS-2/UTF-16或UTF-32(不同的環境對於wchar_t
有不同的大小,對於Linux來說是4,對於Windows來說大多是2)?但是,在Linux或Windows上,wcout << wstr;
不能正確打印希臘字母。當然執行寬字符集的成員和編碼是實現定義的,但不應該成爲實施提供的iostream
設施,以認識和妥善處理的問題,對不對? (雖然執行字符集也實現定義中,iostream
設施能處理好嗎。)當iostream
設施處理什麼是wchar_t
陣列的缺省解釋? (無論如何,爲了澄清,我更關心執行寬字符集的本質,而不是找到在某些平臺上打印寬字符字符串的正確方法。)
PS:我是一個總新手wchar_t
東西,所以我道歉,如果我說了一些非常錯誤的東西。
請注意,這將用於Windows。在Linux中,您使用utf-8編碼(處理大多數文本相關案例的偏好方式)獲得char字符串,使用utf-32獲取4字節wchar_t。 –