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

背景

本文思路来源于交流群内两个群友提出的问题,(如果想加群可加我微信,二维码见文末),问题详情如下:
在这里插入图片描述
在这里插入图片描述

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

解决方案

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

QString

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

  • 使用QString::toHtmlEscaped()将中文转换为html字符串
  • 自定义解析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("&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,最终解决了问题,部分代码如下:

// 字符串解码为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,来进行字符编解码转换。

总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值