省略包含通用字符名称的字符串文字的u8前缀

时间:2016-04-08 10:34:32

标签: c++ c++11 unicode utf-8

如果省略包含通用字符名称的字符串文字的u8前缀,会发生什么?

所以而不是:

u8"\u00a7some-text"

我写这个:

"\u00a7some-text"

1 个答案:

答案 0 :(得分:3)

如果没有u8前缀,字符串将在您平台的执行字符集中进行编码。执行字符集可以是UTF-8(这是几个平台上的默认值),但不能假定它始终是UTF-8(参见this answer)。

如果执行字符集不能编码通用字符名称(或字符串文字中的任何其他值),则结果是实现定义的(即可能导致错误或某些标记值)。例如,考虑代码:

const char* c = "\u00a7";

使用带有-fexec-charset=ascii的GCC 5.3编译时,它会失败并显示错误:

  

错误:将UCN转换为执行字符集:无效或不完整的多字节或宽字符

这是因为U + 00A7不能用ASCII编码。但是,使用u8前缀:

const char* c = u8"\u00A7";

编译成功,c指向字节0xC2 0xA7 0x00

如果您使用u8前缀,则无论平台的配置如何,您的字符串保证都将采用UTF-8编码。