Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少

2023-11-06

Qt开发者来说,特别是初学者,往往最头疼的是编码的问题。举个例子。
1、控件上设置中文标签,发现显示出来是乱码?怎么解决。如果标签是常量字符串(含中文),怎么处理。如果标签是变量,且可能包含字符串,又咋处理?
2、Qt应用与其他应用存在进程间交互,数据中不可避免的包含中文字符。Qt应用譬如使用的是utf8编码,其他应用可能是使用unicode编码或者其他编码,数据交互过程中的中文乱码问题怎么处理?

先只抛出这两个问题。看看有没有戳中朋友们的肋骨。
然后我们说说这两个问题怎么在实际的项目开发过程中避免和解决。

问题一解决方案:
1、控件上显示中文标签乱码问题。
常量字符标签(含中文)的显示方式
(1)【方案一】使用Qt国际化,代码中全部用英文,然后加ts翻译成中文。这种方法不是不可以,但是很stupid,为了解决小小乱码的问题,还要引入翻译模块,简直就是高射炮打蚊子,好么。当然,如果应用本身有国际化需求,对应发布国际市场,那你这么干也无可厚非。
(2)【方案二】 采用如下方式声明和定义常量字符串标签名:

QStringLiteral("这是常量字符串");

如果只是按照上面的方式去设置,譬如:

label->setText(QStringLiteral("这是常量字符串"));

你发现输出展示的仍是乱码岂不是要跟我扯皮。还有两个关键的步骤,你要注意:
1、通常,我们默认编码设置成UTF-8 的模式【重要!重要!】
在这里插入图片描述

2、当前页,在代码编辑区右键鼠标,选择最下面的 ”add Utf-8 bom” 【这里非常重要,估计很多几年开发经验的Qt从业者也未必会注意到】
在这里插入图片描述
另外,一个好的项目一定要注意编码的统一,别一会儿搞个utf8,一回儿搞个gbk或者其他的编码,弄来弄去,项目越来越烂,到最后维护成本越来越高,开发者也被搞的头疼。

问题二解决方案:
1、其实解决这个问题并不只是需要编码层面,更加要注意的是项目管理层面(代码管理),我们在设计之初,就要严格要求编码的一致性。
譬如,Qt应用(作为主应用)与其他不同编码的应用进程间数据交互,我们规定好,Qt应用方接收数据和输出数据必须为utf8编码,定义数据传交互数据类型为char字符串(单字节,宽字节也必须转单字节后再交互)。

附一个转换方法:

std::string stringToUTF8(const std::string& str)
{
    int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
    wchar_t* pwBuf = new wchar_t[nwLen + 1];
    ZeroMemory(pwBuf, nwLen * 2 + 2);
    ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
    int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    char* pBuf = new char[nLen + 1];
    ZeroMemory(pBuf, nLen + 1);
    ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

    std::string strRet(pBuf);

    delete []pwBuf;
    delete []pBuf;
    pwBuf = NULL;
    pBuf  = NULL;

    return strRet;
}

std::string UTF8ToString(const std::string& str)
{
    int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);
    wchar_t* pwBuf = new wchar_t[nwLen + 1];
    memset(pwBuf, 0, nwLen * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
    char* pBuf = new char[nLen + 1];
    memset(pBuf, 0, nLen + 1);
    WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

    std::string strRet = pBuf;

    delete []pBuf;
    delete []pwBuf;
    pBuf = NULL;
    pwBuf = NULL;

    return strRet;
}

其他应用根据此协议来自主转换对应编码即可(当然,这里有个条件,Qt应用必须为主应用,否则一个子应用没有必要这么强势)。
在这里插入图片描述
这一步在项目设计之初就规划好,后续会避免编码的坑。尤其是多应用交互的场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少 的相关文章

随机推荐

  • SpringMVC——静态资源访问之

    web xml 配置
  • 关于不设置div高度时,背景图片或背景颜色不显示的问题

    在写一个网页时 遇到div高度不定时 即高度设为auto 或者不设置时 加入的的背景图片不能显示的问题 在查阅相关资料后发现几种解决方法 出现这种情况有两个前提 1 外部的div没有设置高度 2 内部div浮动 解决方法 1 最直接的方法
  • 多元时间序列

    目录 多元时间序列 RBF径向基神经网络多变量时间序列预测 Matlab完整程序 预测结果 基本介绍 程序设计 参考资料 多元时间序列 RBF径向基神经网络多变量时间序列预测 Matlab完整程序 预测结果 基本介绍 多元时间序列 Matl
  • docker修改镜像的存储位置_Docker中修改镜像、容器的存放目录

    系统是CentOS7 DOCKER 1 13版本 之后版本未测试过 以上步骤在该操作系统和Docker版本下已经测试过 解决方案 在默认情况下 Docker镜像和容器的默认存放位置为 var lib docker 一般根下分区我们不会给太大
  • 爬虫实战

    爬51job url里的内容 项目的开发工具选择Requests模块和BeautifulSoup模块实现爬虫开发与数据清洗 数据存储选择Sqlalchemy框架 数据库选择MySQL 获取城市编号 1 观察搜索页的URL地址 控制变量 观察
  • docker数据管理---数据卷,数据卷容器

    在Docker中 数据卷 data volumes 和数据卷容器 data volume containers 是用于在容器之间共享和持久化数据的两种不同的机制 一 数据卷 数据卷是一个特殊的目录或目录 可以绕过容器文件系统的常规层 直接在
  • 输入一行字符,统计其中各种字符个数(C语言)

    输入一行字符 统计其中各种字符个数 编译环境VS2017 其中输出英文字母 数字 空格以及其他字符的个数 需要注意的是fgets 函数的使用 会在字符串末尾 0前 读入我们在键盘上敲的回车即换行符 n include
  • 自制Web桌面日历

    想要一个带农历的桌面日历 google了半天也没有找到中意的 但是经常浏览网站的时候发现很多不错的日历 直接保存到我的桌面上不就完了吗 下面是具体操作 将中意的日历页面 查看源文件 看是否可以看到script文件 如果可以 就保存到本地 用
  • 【雕爷学编程】Arduino动手做(202)---热释电效应、热释电元件与HC-SR505运动传感器模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手试试多做实验 不管成功
  • vba中find方法查找1

  • QML ListView实现树形效果

    转自 http blog huati365 com 5jELjzLwnx3YGw import QtQuick 2 11 import QtQuick Controls 2 2 import QtQuick Controls Materia
  • Android抓包工具——Fiddler

    前言 在平时和其他大佬交流时 总会出现这么些话 抓个包看看就知道哪出问题了 抓流量啊 payload都在里面 这数据流怎么这么奇怪 这里出现的名词 其实都是差不多的意思啊 这都跟抓包这个词有关 说到抓包呢我们今天就先来了解一下抓包的一些基础
  • MySQL组成

    MySQL 的组成分为两部分 服务器端 服务的提供 相当于卖家 客户端 服务的使 相当于买家 消费者 服务器端只能有一个 而客户端可以有多个 安装了 MySQL 说明我们既是服务器端又是客户端 服务器端的服务体现就是 客户端是使 MySQL
  • 微软亚洲研究院实习生面试

    上周说到微软亚洲研究院 MSRA 一下就简称MSRA吧 网络面试我这边因为连不上而要重新安排面试 周五HR就给我电话约好今天中午1 00 3 00重新面试 于是提前做好各种准备 找了个拉ADSL的宿舍来上网 然后用了人家带摄像头的笔记本 还
  • B站创建视频分集播放列表

    上传视频在B站上创建视频分集列表方法 上传时创建分集列表 1 打开B站 2 登录B站后 点击投稿上传视频 3 上传视频或把视频直接拖拽到页面里 4 点击上传第一个视频后页面下会出现一个 号的按钮 点击 继续上传 上传视频就会出现两个正在上传
  • 浅谈 Node.js 热更新

    大厂技术 高级前端 Node进阶 点击上方 程序员成长指北 关注公众号 回复1 加入高级Node交流群 记得在 15 16 年那会 Node js 刚起步的时候 我在去前东家的入职面试也被问到了要如何实现 Node js 服务的热更新 其实
  • Tuple VS ValueTuple(元组类 VS 值元组)

    Tuple VS ValueTuple 元组类 VS 值元组 文章目录 Tuple VS ValueTuple 元组类 VS 值元组 Tuple 1 创建元组 2 表示一组数据 3 从方法返回多个值 4 用于单参数方法的多值传递 缺点 Va
  • 基于php的课程网站络管理系统的设计与实现

    摘 要 管理系统是根据课程网站的需求而设计和实现的 主要 用于实现课程系统办公人员对其办公系统内所有公务员进行管理 实现对员工信息的查询 录入 修改和删除 以及发布重要通知 最新信息和规章制度 通过 网上办公 无纸办公 大大提高办公效率 体
  • 电脑关机了,内存就没数据了吗?

    前言 大家好 我是周杰伦 提到网络攻击技术 你脑子里首先想到的是什么 是DDoS 是SQL注入 XSS 还是栈溢出 RCE 远程代码执行 这些最常见的网络攻击技术 基本上都是与网络 软件 代码 程序这些东西相关 这也好理解 计算机网络安全
  • Qt项目实战 杂谈一二:中文乱码事情小,处理不好头发少

    Qt开发者来说 特别是初学者 往往最头疼的是编码的问题 举个例子 1 控件上设置中文标签 发现显示出来是乱码 怎么解决 如果标签是常量字符串 含中文 怎么处理 如果标签是变量 且可能包含字符串 又咋处理 2 Qt应用与其他应用存在进程间交互