[英]What is execution wide-character set and its encoding?
標准中提到了很多與字符集相關的概念:基本源字符集,基本執行字符集,基本執行寬字符集,執行字符集和執行寬字符集:
我對基本源字符集,基本執行字符集和基本執行寬字符集沒有太多疑問。
至於執行字符集,標准表示它是實現定義的和特定於語言環境的,所以我試着通過觀察字符串文字初始化的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.