如何找出C ++中当前的charset是什么?

时间:2010-03-17 13:40:17

标签: c++ character-encoding

如何找出当前字符集在C ++中的用途?

在控制台应用程序(WinXP)中,我得到一些字符的负值(如äöüé)

(int)mystring[a]

这让我很惊讶。我期待值在127到256之间。

在c ++中有类似GetCharset()或SetCharset()的内容吗?

4 个答案:

答案 0 :(得分:5)

这取决于您如何看待手头的价值。 char可以签名(例如在Windows上),或者在其他系统上签名。所以,你应该做的是将值打印为unsigned以获得你想要的东西。

到目前为止,C ++与char-set无关。对于Windows控制台,您可以使用:GetConsoleOutputCP

答案 1 :(得分:2)

查看std::numeric_limits<char>::min()max()。如果您不喜欢打字,或者您需要整数常量表达式,请CHAR_MINCHAR_MAX

如果CHAR_MAX == UCHAR_MAXCHAR_MIN == 0则字符未签名(如您所料)。如果CHAR_MAX != UCHAR_MAXCHAR_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值永远不会有意义)。