C++ 11:普通字符串文字和UTF-8字符串文字之间的区别示例?

And*_*zos 6 c++ utf-8 character-encoding string-literals c++11

不以encoding-prefix开头的字符串文字是普通的字符串文字,并使用给定的字符进行初始化.

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

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

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

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

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

Yak*_*ont 6

C和C++语言在其实现中允许大量的自由度.在UTF-8是"以单字节编码文本的方式"之前很久就编写了C:不同的系统具有不同的文本编码.

那么C和C++中字符串的字节值究竟取决于编译器. 'A'是编译器为字符选择的编码A,这可能与UTF-8不一致.

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

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

举一个具体的例子,来自 man gcc

-fexec-字符集的字符集=

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

-finput-字符集的字符集=

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

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