如果省略包含通用字符名称的字符串文字的u8
前缀,会发生什么?
所以而不是:
u8"\u00a7some-text"
我写这个:
"\u00a7some-text"
答案 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编码。