不以encoding-prefix开头的字符串文字是普通字符串 文字,并用给定的字符初始化。
以u8开头的字符串文字,例如u8“asdf”,是一个UTF-8字符串文字,并使用UTF-8编码的给定字符进行初始化。
我不明白普通字符串文字和UTF-8字符串文字之间的区别。
有人可以提供一个他们不同的情况的例子吗? (导致不同的编译器输出)
(我的意思是标准的POV,而不是任何特定的实现)
字符文字或字符串文字中的每个源字符集成员,以及每个转义符 字符文字或非原始字符串文字中的序列和通用字符名称将转换为 执行字符集的相应成员。
答案 0 :(得分: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 ++的执行和输入字符集的示例。