带有UTF-8执行字符集的C ++ 11字符文字'\ xC4'标准类型?

时间:2013-02-24 22:08:02

标签: c++ unicode utf-8 c++11 x86-64

考虑一个C ++ 11编译器,其执行字符集为UTF-8(并且符合x86-64 ABI,要求char类型为带符号的8位字节)。

字母Ä(变音符号)的unicode代码点为0xC4,并且具有2个代码单元UTF-8表示{0xC3, 0x84}

编译器为字符文字'\xC4'指定int类型,其值为0xC4

编译器是否符合标准且符合ABI标准?你的推理是什么?

C ++ 11标准的相关引用:

2.14.3.1

  

包含单个c-char的普通字符文字具有char类型,其值等于执行字符集中c-char编码的数值。包含多个的普通字符文字   一个c-char是一个多字符文字。多字符文字具有int类型和实现定义   值。

2.14.3.4

  

escape \ xhhh由反斜杠后跟x后跟   一个或多个十六进制数字,用于指定所需字符的值。角色的价值   如果文本超出为char

定义的实现定义范围,则literal是实现定义的

3 个答案:

答案 0 :(得分:2)

§2.14.3第1段无疑是(C ++ 11)标准中的相关文本。但是,原文中有几个缺陷,最新版本包含以下文字,重点是:

  

多字符文字,或包含单个c-char的普通字符文字,在执行字符集中无法表示,是有条件支持的,具有类型int ,并且具有实现定义的值。

虽然这已被接受为defect,但它实际上并不构成任何标准的一部分。但是,它是一个建议,我怀疑很多编译器都会实现它。

答案 1 :(得分:1)

从2.1.14.3p4开始:

  

如果字符文字的值超出为char

定义的实现定义范围,则它是实现定义的

历史上的x86编译器(正如你所指出的那样,这种做法现在是某种形式的官方标准)签署了char s。 \xc7超出范围,因此需要实现来记录它将产生的字面值。

看起来你的实现提升了用\ x转义为(范围内)整数文字指定的超出范围的字符文字。

答案 2 :(得分:0)

你正在混合苹果,橘子,梨和金橘:)

是的,“\ xc4”是一个合法的字符文字。具体来说,标准称之为“狭义字符文字”。

来自C ++标准:

  

基本源字符集成员的字形是   旨在识别ISO / IEC 10646子集中的字符   对应于ASCII字符集。但是,因为映射   从源文件字符到源字符集(描述于   转换阶段1)被指定为实现定义的,a   实现是否需要记录基本源字符的方式   在源文件中表示。

这可能有助于澄清:

如果您不熟悉它,这也可能会有所帮助:

这是另一个好的,简洁的 - 有启发性的 - 参考: