【发布时间】: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