7

不以编码前缀开头的字符串文字是普通的字符串文字,并使用给定的字符进行初始化。

以 u8 开头的字符串文字,例如 u8"asdf",是 UTF-8 字符串文字,并使用以 UTF-8 编码的给定字符进行初始化。

我不明白普通字符串文字和 UTF-8 字符串文字之间的区别。

有人可以提供一个他们不同的情况的例子吗?(导致不同的编译器输出)

(我的意思是从标准的 POV,而不是任何特定的实现)

字符文字或字符串文字中的每个源字符集成员,以及字符文字或非原始字符串文字中的每个转义序列和通用字符名称,都将转换为执行字符集的相应成员。

4

1 回答 1

7

C 和 C++ 语言在其实现中允许有很大的自由度。C 语言早在 UTF-8 成为“以单字节编码文本的方式”之前就已经编写好了:不同的系统有不同的文本编码。

因此,C 和 C++ 中字符串的字节值实际上取决于编译器。 'A'是编译器为 character 选择的编码A,它可能与 UTF-8 不一致。

C++ 增加了编译器必须支持真正的 UTF-8 字符串文字的要求。的位值u8"A"[0]由 C++ 标准通过 UTF-8 标准固定,与编译器所针对的平台的首选编码无关。

现在,就像大多数平台 C++ 目标使用 2 的补码整数一样,大多数编译器都具有大多数与 UTF-8 兼容的字符编码。"hello world"所以对于像,这样的字符串u8"hello world"几乎可以肯定是相同的。

举一个具体的例子,从man gcc

-fexec-charset=字符集

设置执行字符集,用于字符串和字符常量。默认值为 UTF-8。charset 可以是系统的 iconv 库例程支持的任何编码。

-finput-charset=字符集

设置输入字符集,用于从输入文件的字符集转换为 GCC 使用的源字符集。如果 locale 没有指定,或者 GCC 无法从 locale 中获取此信息,则默认为 UTF-8。这可以被语言环境或此命令行选项覆盖。目前,如果存在冲突,命令行选项优先。charset 可以是系统的 iconv 库例程支持的任何编码。

是能够更改 C/C++ 的执行和输入字符集的示例。

于 2013-02-04T03:06:19.073 回答