问题详情如下:
QString中文乱码
std::string解析中文乱码
这两个问题存在一个共同现象:英文可以正常生成和解析,一旦涉及到中文便会出现乱码。基于此现象猜测原因为中文字符串编码/解码的问题。最终均引导(请允许我妄自尊大的称之为引导)读者朋友解决了相应问题。
由于如上的两个问题分别涉及到QString和std::string,故其解决方案分别叙述如下:
针对于QString,之前的经验是字符传输、编码时不要使用中文,如果存在中文,则需要将中文转换为html字符串,所以解决方案为
//转为为html字符串
QString str = "中华<:>vcg.com<:>0^v^人民<:>1<:>0<|>共和国<:>vcg*33*lei<:>2<|>万岁<:>15912344321<:>0";
auto html_str = str.toHtmlEscaped();
//自定义解析html字符串
QString fromHtmlEscaped(const QString& htmlEscaped) {
QString result = htmlEscaped;
// 替换常见的 HTML 转义字符
result.replace("<", "<");
result.replace(">", ">");
result.replace("&", "&");
result.replace(""", "\"");
result.replace("'", "'");
result.replace(" ", " ");
// 可以根据需要添加更多的 HTML 转义字符替换
return result;
}
读者朋友经过与服务端同学沟通,其字符串编码为utf-8,所以解决方案为将字符串转换为utf-8编码的std::string,最终解决了问题,部分代码如下:
// 字符串解码为utf-8
std::string decoded2Utf8(const std::string& input) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
auto wstr = converter.from_bytes(input);
return converter.to_bytes(wstr);
}
基于如上的两个问题,再次回顾中文乱码问题。乱码的出现往往是编解码不匹配导致。所谓编码就是将字符映射到二进制数据的过程,而解码则是将二进制数据还原为字符的过程。如果编码和解码的不匹配时,就会出现乱码。例如,如果使用UTF-8编码保存文件,但使用GBK解码,则原本的中文字符可能会被误读为乱码。
为了避免乱码问题,开发者可以采取以下几种方法来确保正确的编码转换和字符串处理。
总的来说,中文乱码问题并非一个过时的话题,反而是日常开发中时常遇到的一个实际问题。在尽量避免使用中文的基础上,需要确保编码和解码的一致性,以确保字符的正确显示和处理,避免出现乱码的情况。