2014-02-26 27 views
6

相當有關字符集的幾個概念將在標準中提到:基本源字符集,基本執行字符集,基本執行寬字符集,執行字符集,並執行寬字符集:什麼是執行寬字符集及其編碼?

  • 基本源字符集: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東西,所以我道歉,如果我說了一些非常錯誤的東西。

回答

0

基本上char使用1個字節來編碼符號並用於ANSII文本。如果您的應用程序僅處理拉丁語,則可以使用。如果您想要支持所有其他語言(例如俄語),則必須使用多字節或Unicode編碼。這是wchar_t有用的地方。如果你寫了sizeof(wchar_t),你會看到2個字節用於編碼一個符號。

當您決定使用wchar_t(寬字符)時,您必須使用支持此類型的函數。你會發現許多字符串函數(fopen_s,string)對於wchar_t具有模擬:_wfopen_s,wstring。

+0

請注意,這將用於Windows。在Linux中,您使用utf-8編碼(處理大多數文本相關案例的偏好方式)獲得char字符串,使用utf-32獲取4字節wchar_t。 –

1

執行寬字符集是運行時用來對wchar_t進行編碼的字符集。見N3337 S2.3。

編碼是實現定義的。在所有現代系統和平臺上,它將是Unicode(ISO-10646),但沒有任何東西可以實現。在較老的平臺上,例如IBM大型機,它可能是DBCS或其他不同的東西。你不會看到它,但這是標準允許的。

EWCS需要有一些特定的成員和轉換。它需要與庫函數正常工作。這些並不是強硬的限制。

寬字符實際上可以是短int(如在Windows上)或int 32(如在Unix上)並且仍然是相同的字符集(Unicode)。

+0

感謝您的分享。儘管執行字符集和執行寬字符集都是實現定義的,但iostream工具可以正確處理執行字符集(Linux上的utf-8和Windows上的各種代碼頁編碼),但無法正確處理執行寬字符集(至少在事先沒有進行某些設置的情況下)。是否因爲標準對此沒有要求,所以標準的圖書館實施者可以自由地放鬆他們的工作? – goodbyeera

+0

如果您有特定的內容,請編輯您的問題。我很樂意嘗試回答,但你需要提供一個具體的例子(一個SSEEC)。 –