前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >2025年了,中文乱码的问题仍然存在

2025年了,中文乱码的问题仍然存在

作者头像
程序员的园
发布2025-01-22 09:31:33
发布2025-01-22 09:31:33
10600
代码可运行
举报
运行总次数:0
代码可运行

问题详情如下:

QString中文乱码

std::string解析中文乱码

这两个问题存在一个共同现象:英文可以正常生成和解析,一旦涉及到中文便会出现乱码。基于此现象猜测原因为中文字符串编码/解码的问题。最终均引导(请允许我妄自尊大的称之为引导)读者朋友解决了相应问题。

解决方案

由于如上的两个问题分别涉及到QString和std::string,故其解决方案分别叙述如下:

QString

针对于QString,之前的经验是字符传输、编码时不要使用中文,如果存在中文,则需要将中文转换为html字符串,所以解决方案为

  • 使用QString::toHtmlEscaped()将中文转换为html字符串
  • 自定义解析html字符串
代码语言:javascript
代码运行次数:0
运行
复制
//转为为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("&lt;", "<");
    result.replace("&gt;", ">");
    result.replace("&amp;", "&");
    result.replace("&quot;", "\"");
    result.replace("&#39;", "'");
    result.replace("&nbsp;", " ");
    // 可以根据需要添加更多的 HTML 转义字符替换

    return result;
}

std::string

读者朋友经过与服务端同学沟通,其字符串编码为utf-8,所以解决方案为将字符串转换为utf-8编码的std::string,最终解决了问题,部分代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
// 字符串解码为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解码,则原本的中文字符可能会被误读为乱码。

建议

为了避免乱码问题,开发者可以采取以下几种方法来确保正确的编码转换和字符串处理。

  • 避免使用中文:结合如上的两个问题,英文状态下不存在任何问题,一旦涉及到中文便会出现乱码,所以应该尽量避免使用中文。但是开发者不能限制业务——业务中不使用中文,但开发者能做的是进行转换,如上文中的将含有中文的QString转换为html字符串,最后显示时再html转换为带有中文的QString。
  • 使用统一的编码格式:在处理字符串时,确保使用统一的编码格式。UTF-8是当前互联网最常用的字符编码格式,它兼容ASCII且能表示几乎所有语言的字符。使用UTF-8编码/解码可以最大限度地减少跨平台时的编码问题。
  • 使用第三方库进行编码转换:C++标准库并没有内建的工具来处理编码转换,因此开发者常常依赖于第三方库,如Boost.Locale或iconv,来进行字符编解码转换。

总结

总的来说,中文乱码问题并非一个过时的话题,反而是日常开发中时常遇到的一个实际问题。在尽量避免使用中文的基础上,需要确保编码和解码的一致性,以确保字符的正确显示和处理,避免出现乱码的情况。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员的园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决方案
    • QString
    • std::string
  • 乱码
  • 建议
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档