C++中u8""与普通""字符串的差异及输出异常问题
问题解析:UTF-8字符串字面量与普通字符串字面量的输出差异
原代码与输出
源代码
std::string utf8_string = u8"你好,世界"; std::string simple_string = "你好,世界"; std::cout << utf8_string.size()<<":" << utf8_string << std::endl; std::cout << simple_string.size()<<":"<<simple_string << std::endl;
源文件以UTF-8编码保存。
执行输出
15:浣犲ソ锛屼笘鐣 10:你好,世界
差异原因
u8"你好,世界"的行为:
这是C++11引入的UTF-8字符串字面量,编译器会直接将字符串内容编码为UTF-8字节序列。"你好,世界"包含5个UTF-8字符(每个汉字、中文逗号占3字节),总字节数为5×3=15,所以size()返回15。
输出乱码是因为控制台的编码不是UTF-8(比如Windows默认控制台编码为GBK/CP936),UTF-8字节被控制台按当前编码解析,导致显示异常。"你好,世界"的行为:
普通字符串字面量的编码规则是:编译器先按源文件编码(UTF-8)读取字符串,再将其转换为执行字符集(多数Windows下的编译器默认执行字符集为GBK/CP936)。每个汉字、中文逗号在GBK中占2字节,总字节数为5×2=10,所以size()返回10。
此时控制台编码与执行字符集一致,所以能正常显示中文。
内容的提问来源于stack exchange,提问作者Shellong
相关产品推荐
相关产品推荐

