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)
从去true到false.我还在使用小端系统,所以我不明白发生了什么.
NB.我不是想使用对应关系u"????"== u"\007\116\015\116\227\137\362\135".我只是想了解发生了什么.
我发现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