【问题标题】:C++11 character literal '\xC4' standard type with UTF-8 execution character set?具有 UTF-8 执行字符集的 C++11 字符文字“\xC4”标准类型?
【发布时间】:2013-02-10 00:31:36
【问题描述】:

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

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

编译器将int 类型的字符文字'\xC4' 赋值为0xC4

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

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

2.14.3.1

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

2.14.3.4

转义符 \xhhh 由反斜杠后跟 x 后跟 一个或多个十六进制数字,用于指定所需字符的值。一个角色的价值 如果字面量超出为 char 定义的实现定义范围,则它是实现定义的

【问题讨论】:

  • \xC4 不是\xC3\x84,这是你想要的字符。
  • @RemusRusanu:“采用十六进制数字来指定所需字符的值”。我认为所需字符的值意味着它的代码点,指定“所需字符的代码单元”(正如您似乎暗示的那样)是不明智的,因为字符可以有多个代码单元(并在 UTF-8 编码的 Ä) 的情况下执行。

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


【解决方案1】:

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

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

来自 C++ 标准:

基本源字符集成员的字形是 旨在识别来自 ISO/IEC 10646 子集的字符 对应 ASCII 字符集。但是,由于映射 从源文件字符到源字符集(在 翻译阶段 1) 被指定为实现定义,一个 实现需要记录基本的源字符如何 在源文件中表示。

这可能有助于澄清:

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

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

【讨论】:

  • 我同意'\xC4'是一个合法的字符文字,但是它在UTF-8的执行字符集中的表示是16位(0xC3,0x84),因此不适合@类型987654325@ 是 8 位。那么首先你建议'\xC4' 的类型是什么?
  • 另外我认为引用不相关,字符文字'\xC4'由5个字符组成,即'、\、C4'-全部它们是基本源字符集(由 96 个 ASCII 字符组成)的成员。
【解决方案2】:

从 2.1.14.3p4 开始:

如果字符文字的值超出为 char 定义的实现定义范围,则它的值是实现定义的

x86 编译器在历史上(正如您所指出的,这种做法现在已成为某种官方标准)已签署 chars。 \xc7 超出了这个范围,因此需要实现来记录它将产生的文字值。

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

【讨论】:

  • 学究式:x86-64 C++ 编译器要求char 成为符合 ABI 的 8 位有符号字节,这不仅仅是历史趋势。
  • 你能澄清一下你所说的“提升超出范围的字符文字”是什么意思吗?你的意思是把他们提升到int?您是说这是还是不符合标准的行为?
  • 我不相信 C++ 标准要求他们这样做。并非每个编译器都必须遵循所有标准。
  • 不是 ABI,不是 C++ 标准。 ABI 是x86-64 标准。
【解决方案3】:

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

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

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

【讨论】:

  • 我认为对于有人将超出范围的值直接放入 char 字面量(将“Ä”作为单字节值)的情况下,这是正确的语言,但它有什么意义'\xc7',它的转义序列不是 c-char?
  • @jthill:一个c-char,根据语法,包括一个escape-sequence。所以我认为\xC7 是一个c-char
  • 是的,前提是“采用十六进制数字指定所需字符的值”是指代码点作为值,而不是'\xC4''Ä'的行为应该是相同。
  • @rici (duh) 对。不知道我从哪里得到 c-char 不包含转义的想法。
  • ...在这两种情况下,类型都不能是执行字符集为 UTF-8 的单字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2014-02-05
  • 2013-06-29
  • 2012-01-14
  • 2013-09-06
  • 2013-05-26
相关资源
最近更新 更多