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

时间:2013-02-04 02:42:18

标签: c++ utf-8 character-encoding c++11 string-literals

  

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

     

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

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

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

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

  

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

1 个答案:

答案 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 ++的执行和输入字符集的示例。