2016-04-08 45 views

回答

3

没有u8前缀,字符串将在执行字符编码设置你的平台。执行字符集可能是UTF-8(这是多个平台上的默认值),但不能假定为始终为UTF-8(请参阅this answer)。

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

const char* c = "\u00a7"; 

当使用GCC 5.3 -fexec-charset=ascii编译,它失败,错误:

error: converting UCN to execution character set: Invalid or incomplete multibyte or wide character

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

const char* c = u8"\u00A7"; 

编译成功,并c指向字节0xC20xA70x00

如果您使用u8前缀,那么您的字符串是保证为UTF-8编码,无论平台的配置如何。