[英]How can I find out what the current charset is in C++?
如何找出C ++中當前的charset是什么?
在控制台應用程序(WinXP)中,我得到一些字符(如äöüé)的負值
(int)mystring[a]
這讓我很驚訝。 我期待值在127到256之間。
那么在c ++中有類似GetCharset()或SetCharset()的東西嗎?
這取決於你如何看待手頭的價值。 char
可以簽名(例如在Windows上),或者在其他系統上簽名。 因此,您應該做的是將值打印為unsigned以獲得您要求的內容。
到目前為止,C ++與char-set無關。 對於Windows控制台,您可以使用: GetConsoleOutputCP
。
查看std::numeric_limits<char>::min()
和max()
。 如果您不喜歡打字,或者您需要一個整數常量表達式,請使用CHAR_MIN
和CHAR_MAX
。
如果CHAR_MAX == UCHAR_MAX
且CHAR_MIN == 0
則chars是無符號的(如您所料)。 如果CHAR_MAX != UCHAR_MAX
和CHAR_MIN < 0
,則簽名(如您所見)。
在標准3.9.1 / 1中,確保沒有其他可能性:“...普通char可以采用與signed char或unsigned char相同的值;哪一個是實現定義的。”
這會告訴你char
是簽名還是未簽名,這就是讓你感到困惑的原因。 您當然不能調用任何東西來修改它:從程序的POV開始,即使編譯器有改變它的方法,它也會被編譯到編譯器中(GCC當然-fsigned-char
: -fsigned-char
和-funsigned-char
)。
解決這個問題的常用方法是,如果要將char
為int
,則首先通過unsigned char
它。 所以在你的例子中, (int)(unsigned char)mystring[a]
。 這可確保您獲得非負值。
它實際上並沒有告訴你你的實現用於char
charset,但我認為你不需要知道。 在Microsoft編譯器上,答案基本上是常用的字符編碼“ISO-8859-mutter-mutter”。 這意味着具有7位ASCII值的字符由該值表示,而該范圍之外的值是不明確的,並且將由控制台或其他收件人根據收件人的配置方式進行解釋。 ISO Latin 1除非另有說明。
正確地說,解釋字符的方式是特定於語言環境的,並且可以使用一大堆東西來修改和查詢語言環境,這些東西是C ++標准的末尾,我個人從未經歷過,也無法提出建議; - )
請注意,如果有效的charset與您的控制台使用的charset之間存在不匹配,那么您可能遇到麻煩。 但我認為這與你的問題是分開的:字符是否可以是否定的與字符集無關,只是字符是否已簽名。
字符通常默認簽名。 試試這個。
cout << (unsigned char) mystring[a] << endl;
標准提供的唯一保證是基本字符集的成員:
2.2字符集
3基本執行字符集和基本執行寬字符集應各自包含基本源字符集的所有成員,以及表示alert,backspace和回車符的控制字符,以及空字符(分別為null寬字符) ,其表示全部為零位。 對於每個基本執行字符集,成員的值應是非負的並且彼此不同。 在源和執行基本字符集中,上述十進制數字列表中0之后的每個字符的值應比前一個值大1。 執行字符集和執行寬字符集分別是基本執行字符集和基本執行寬字符集的超集。 執行字符集的成員值是實現定義的,任何其他成員都是特定於語言環境的
此外, char
類型應該包含:
3.9.1基本類型
1聲明為字符(char)的對象應足夠大,以存儲實現的基本字符集的任何成員。
因此,沒有任何保證可以為您提到的角色獲得正確的價值。 但是,嘗試使用unsigned int
來保存此值(出於所有實際目的,如果要打印它們/傳遞,使用有符號類型來保存char
值永遠不會有意義)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.