C++:Unicode字符串文字的可移植性

Moh*_*han -2 c++ unicode string-literals

在gcc上调试时,我发现Unicode文字u"????"表示为u"\007\116\015\116\227\137\362\135".哪个有意义 - ?是0x4E07,而八进制中的0x4E是116.

现在在基于Intel的Macbook上的Apple LLVM 9.1.0上,我发现相同的文字不会被处理为相同的字符串,即:

u16string{u"????"} == u16string{u"\007\116\015\116\227\137\362\135"}
Run Code Online (Sandbox Code Playgroud)

从去truefalse.我还在使用小端系统,所以我不明白发生了什么.

NB.我不是想使用对应关系u"????"== u"\007\116\015\116\227\137\362\135".我只是想了解发生了什么.

Rem*_*eau 7

我发现Unicode文字u"????"表示为u"\007\116\015\116\227\137\362\135"

不,实际上并非如此.这就是为什么......

u"..."字符串文字char16_t在所有平台上编码为基于UTF-16编码的字符串(这是u前缀专门用于的字符串).

u"????" 由此UTF-16代码序列表示:

4E07 4E0D 5F97 5DF2
Run Code Online (Sandbox Code Playgroud)

在little-endian系统上,UTF-16序列由此原始字节序列表示:

07 4E 0D 4E 97 5F F2 5D
Run Code Online (Sandbox Code Playgroud)

在八进制中,"\007\116\015\116\227\137\362\135"只有在使用char基于字符串字符串时才会表示(注意缺少字符串前缀,或者u8也适用于此示例).

u"\007\116\015\116\227\137\362\135"不是一个char基于字符串!它是一个char16_t基于字符串字符串,其中每个八进制数代表一个单独的UTF-16代码单元.因此,此字符串实际上表示此UTF-16代码序列:

0007 004E 000D 004E 0097 005F 00F2 005D
Run Code Online (Sandbox Code Playgroud)

这就是为什么你的两个u16string对象不是比较相同的字符串值.因为他们真的不平等.

你可以在这里看到这个:Live Demo