簡體   English   中英

什么是執行寬字符集及其編碼?

[英]What is execution wide-character set and its encoding?

標准中提到了很多與字符集相關的概念:基本源字符集,基本執行字符集,基本執行寬字符集,執行字符集和執行寬字符集:

  • 基本源字符集:91個圖形字符,加上空格字符,HT,VT,FF,LF(只是從ASCII借用名稱縮寫)。
  • 基本執行(寬)字符集:基本源字符集的所有成員,加上BEL,BS,CR,(寬)NUL。
  • 執行字符集和執行寬字符集分別是基本執行字符集和基本執行寬字符集的實現定義的超集。 執行字符集的成員值和其他成員集是特定於語言環境的。

我對基本源字符集,基本執行字符集和基本執行寬字符集沒有太多疑問。

至於執行字符集,標准表示它是實現定義的和特定於語言環境的,所以我試着通過觀察字符串文字初始化的char數組的字節內容來獲得一些真正的意義,該數組的值應該等於數值的執行字符集中字符的編碼(由於多字節編碼,通用字符名稱可能映射到多個char元素):

char str[] = "Greek lowercase alpha is: \u03B1.";

似乎Linux上幾乎總是utf-8( CE B1存儲在希臘字母的數組中)。 在Windows上,如果系統區域設置為英語(由於希臘語在Windows-1252中不可用,則存儲了一些錯誤值3F ),以及其他區域設置的其他編碼(例如,cp936中的A6 C1用於中文語言環境,在Windows中為E1 ),則為Windows-1252 -1253表示希臘語語言環境,分別代表這兩種編碼中的希臘小寫字母alpha)。 對於希臘語字母在語言環境中可用的所有情況(因此在執行字符集中可用), cout << str; 可以適當地打印希臘字母。 一切似乎都沒問題。

但對於執行寬字符集,我不太了解。 它在主要平台上的確切編碼是什么? 似乎希臘小寫字母alpha的ISO-10646值0x3B1總是存儲在wchar_t以便在我嘗試的所有平台上進行如下所示的聲明:

wchar_t wstr[] = L"Greek lowercase alpha is: \u03B1."; 

所以我猜執行寬字符集可能是UCS-2 / UTF-16或UTF-32(不同的環境對於wchar_t有不同的大小,4用於Linux,2用於Windows)? 但是, wcout << wstr; 不能在Linux或Windows上正確打印希臘字母。 當然,執行寬字符集的成員和編碼是實現定義的,但對於實現提供的iostream工具來說,這應該不是一個問題,以便正確地識別和處理它,對吧? (雖然執行字符集也是實現定義的,但iostream工具可以正常處理它。)當iostream工具處理時, wchar_t數組的默認解釋是什么? (無論如何,只是為了澄清,我對執行寬字符集的本質更感興趣,而不是找到在某些平台上打印寬字符串的正確方法。)

PS:我對wchar_t東西都是新手,所以如果我說錯了,我會道歉。

執行寬字符集只是在運行時用於編碼wchar_t的字符集。 見N3337 S2.3。

編碼是實現定義的。 在所有現代系統和平台上,它都是Unicode(ISO-10646),但沒有任何東西可以做到這一點。 在IBM大型機等較舊的平台上,它可能是DBCS或其他不同的東西。 你不會看到它,但這是標准允許的。

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

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM