如何找出当前字符集在C ++中的用途?
在控制台应用程序(WinXP)中,我得到一些字符的负值(如äöüé)
(int)mystring[a]
这让我很惊讶。我期待值在127到256之间。
在c ++中有类似GetCharset()或SetCharset()的内容吗?
答案 0 :(得分:5)
这取决于您如何看待手头的价值。 char
可以签名(例如在Windows上),或者在其他系统上签名。所以,你应该做的是将值打印为unsigned以获得你想要的东西。
GetConsoleOutputCP
。
答案 1 :(得分:2)
查看std::numeric_limits<char>::min()
和max()
。如果您不喜欢打字,或者您需要整数常量表达式,请CHAR_MIN
和CHAR_MAX
。
如果CHAR_MAX == UCHAR_MAX
和CHAR_MIN == 0
则字符未签名(如您所料)。如果CHAR_MAX != UCHAR_MAX
和CHAR_MIN < 0
已签名(正如您所见)。
在标准3.9.1 / 1中,确保没有其他可能性:“...普通char可以采用与signed char或unsigned char相同的值;哪一个是实现定义的。 “
这会告诉您char
是签名还是未签名,这就是令您困惑的问题。你当然不能调用任何东西来修改它:从程序的POV中它被编入编译器,即使编译器有改变它的方法(GCC肯定会:-fsigned-char
和-funsigned-char
)。 / p>
处理此问题的常用方法是,如果您要将char
投射到int
,请首先通过unsigned char
投射。在您的示例中,(int)(unsigned char)mystring[a]
。这可以确保您获得非负值。
它实际上并没有告诉你实现对char
使用什么字符集,但我认为你不需要知道。在Microsoft编译器上,答案基本上是常用的字符编码“ISO-8859-mutter-mutter”。这意味着具有7位ASCII值的字符由该值表示,而该范围之外的值是不明确的,并且将由控制台或其他收件人根据收件人的配置方式进行解释。除非另有说明,否则ISO拉丁语1。
正确地说,解释字符的方式是特定于语言环境的,并且可以使用一大堆东西来修改和查询语言环境,直到C ++标准的末尾,我个人从未经历过,并且无法提供建议在; - )
请注意,如果有效的charset与您的控制台使用的charset之间存在不匹配,那么您可能遇到麻烦。但我认为这与你的问题是分开的:字符是否可以是负数与字符集无关,只是字符是否已签名。
答案 2 :(得分:1)
字符通常默认签名。 试试这个。
cout << (unsigned char) mystring[a] << endl;
答案 3 :(得分:0)
标准提供的唯一保证是基本字符集的成员:
2.2字符集
3 基本执行字符集 和基本执行宽字符 每个集合应包含所有成员 基本源字符集, 加上控制字符代表 警报,退格和回车, 加上一个空字符(分别为: null宽字符),其中 表示具有全零位。对于 每个基本执行字符集, 成员的价值应该是 非消极的,不同于一个 另一个。在源和 执行基本字符集, 在0之后的每个字符的值 以上十进制数字列表应为 一个大于的价值 以前。执行字符集 和执行宽字符集 是基本执行的超集 字符集和基本执行 广义字符集。该 执行成员的值 字符集是 实现定义的,任何 其他成员是特定于语言环境的
此外,类型char
应该保留:
3.9.1基本类型
1 声明为字符(char)的对象应足够大,以存储任何成员 实施的基础 字符集。
因此,没有任何保证可以为您提到的角色获得正确的价值。但是,尝试使用unsigned int
来保存此值(出于所有实际目的,如果要打印它们/传递,使用带符号类型来保存char
值永远不会有意义)。