【QT常用技术讲解】QSettings把中文输入到配置文件

embedded/2024/11/19 6:13:09/

前言

        在 QT 中,使用 QSettings 时,默认是将字符串以 Unicode 格式存储,而不是以 UTF-8 编码直接写入配置文件。因为涉及到配置文件,有些时候,配置信息由界面端进行写操作,而后台服务进程进行读取并处理,碰巧便于维护的要求,某些配置项需要中文时,就需要设置为UTF-8格式存储。

功能讲解

QString设置UTF-8编码

#include <QSettings>
#include <QDebug>void MainWindow::saveconfmsg(){QSettings settings("config.ini", QSettings::IniFormat);//打开文件QString savestr="测试";// 保存中文字符settings.setValue("ChineseText", savestr);
}void MainWindow::getconfmsg(){QSettings settings("config.ini", QSettings::IniFormat);//打开文件// 读取中文字符QString confText = settings.value("ChineseText").toString();qDebug() << confText ;}

通常,如果配置文件的配置项只是QT界面端进行调用的话,以上的保存和读取函数已经够用了,但此时config.ini配置文件中保存的内容是Unicode编码,如下图所示:

而且在测试过程中还发现了会出现多加上了双引号的情况,此时只需要设置为UTF-8方式,即可解决此类问题,代码如下:

#include <QSettings>
#include <QDebug>void MainWindow::saveconfmsg(){QSettings settings("config.ini", QSettings::IniFormat);//打开文件settings.setIniCodec("UTF-8");//-------设置为UTF-8方式QString savestr="测试";// 保存中文字符settings.setValue("ChineseText", savestr);
}void MainWindow::getconfmsg(){QSettings settings("config.ini", QSettings::IniFormat);//打开文件settings.setIniCodec("UTF-8");//-------设置为UTF-8方式// 读取中文字符QString confText = settings.value("ChineseText").toString();qDebug() << confText ;}

另外,本人测试了QTextCodec的方式无效

QTextCodec *codec = QTextCodec::codecForName("UTF-8");

 Unicode转utf-8

如果界面端已经把中文以Unicode编码方式写入到配置文件,后台服务程序又是普通的C++程序,这时就需要进行Unicode转utf-8

#include <vector>
#include <iomanip>
#include <chrono>
#include <string>
#include <dlfcn.h>
#include <sstream>
#include <fstream>
// 将 Unicode 码点转换为 UTF-8 字符串
std::string unicodeToUtf8(unsigned int codepoint) {std::string utf8;if (codepoint <= 0x7F) {utf8.push_back(static_cast<char>(codepoint));} else if (codepoint <= 0x7FF) {utf8.push_back(static_cast<char>((codepoint >> 6) | 0xC0));utf8.push_back(static_cast<char>((codepoint & 0x3F) | 0x80));} else if (codepoint <= 0xFFFF) {utf8.push_back(static_cast<char>((codepoint >> 12) | 0xE0));utf8.push_back(static_cast<char>(((codepoint >> 6) & 0x3F) | 0x80));utf8.push_back(static_cast<char>((codepoint & 0x3F) | 0x80));} else {utf8.push_back(static_cast<char>((codepoint >> 18) | 0xF0));utf8.push_back(static_cast<char>(((codepoint >> 12) & 0x3F) | 0x80));utf8.push_back(static_cast<char>(((codepoint >> 6) & 0x3F) | 0x80));utf8.push_back(static_cast<char>((codepoint & 0x3F) | 0x80));}return utf8;
}// 解析 Unicode 字符串并转换为 UTF-8
std::string convertUnicodeStringToUtf8(const std::string& input) {std::string result;bool bflag=false;char flag1='\\';char flag2='x';size_t strlen=input.size();for(size_t i=0;i<strlen;i++){char ch=input[i];if(ch==flag1) {bflag=true;continue;//printf("i=%ld\n",i);}if(bflag==true && ch==flag2){if(((i+2)<strlen && input[i+3]==flag1)||(i+3)==strlen){//数字类型:\x31\x32\x33std::string hexStr = input.substr(i + 1, 2);unsigned int codepoint = std::stoul(hexStr, nullptr, 16);  // 转换为整数std::cout << hexStr << "=>" << unicodeToUtf8(codepoint) << std::endl;i+=2;result+=unicodeToUtf8(codepoint);}else if((i+5)<=strlen){std::string hexStr = input.substr(i + 1, 4);unsigned int codepoint = std::stoul(hexStr, nullptr, 16);  // 转换为整数//std::cout << hexStr << "=>" << unicodeToUtf8(codepoint) << std::endl;i+=4;result+=unicodeToUtf8(codepoint);}}else{bflag=false;//printf("i=%ld ch=%c\n",i,ch);result+=ch;}}//std::cout << "=>" << result << std::endl;return result;
}int main(){Getbaseinfo(CONFIGPATH);//需要自己实现std::string utf8_hanzistr = convertUnicodeStringToUtf8(conf_hanzistr);//====转码}

注:以上的convertUnicodeStringToUtf8()未去掉双引号。


http://www.ppmy.cn/embedded/138705.html

相关文章

Maven的下载安装及配置

一、下载Maven 1、访问Maven官网&#xff1a; 打开浏览器&#xff0c;访问Maven的官方网站&#xff1a;Download Apache Maven – Maven 2、选择Maven版本&#xff1a; 在下载页面上&#xff0c;选择适合您操作系统的Maven版本。通常&#xff0c;Maven提供二进制zip归档和tar…

Eclipse 任务管理

Eclipse 任务管理 Eclipse 是一个广泛使用的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了强大的任务管理功能&#xff0c;帮助开发人员有效地组织和管理他们的工作。本文将详细介绍 Eclipse 任务管理系统的功能和使用方法&#xff0c;以及如何利用它来提高开…

npm上传自己封装的插件(vue+vite)

一、npm账号及发包删包等命令 若没有账号&#xff0c;可在npm官网&#xff1a;https://www.npmjs.com/login 进行注册。 在当前项目根目录下打开终端命令窗口&#xff0c;常见命令如下&#xff1a; 1、登录命令&#xff1a;npm login&#xff08;不用每次都重新登录&#xff0…

已有账号,重装系统激活office后发现没有ppt,word,excel等

有时候重装系统后&#xff0c;登录windows结果右键没有word,excel等 点击进入office 进入右边的账户 找到设备和订阅 直接下载office 安装后就会出现了

matlab 读取csv

需要跳过第一行表头等信息 1、读取整个文件 csvread(FILENAME)%文件路径 文件名2、指定起始位置 csvread(FILENAME, R, C)%从文件的第R行和第C列开始读取数据 逗号分开3、指定数据范围 csvread(FILENAME, R, C, [R1 C1 R2 C2])%读取从(R1, C1)到(R2, C2)范围内的数据注意&am…

使用 VS Code 远程连接时解决 OpenSSL 版本不匹配及权限问题

在使用 VS Code 通过 SSH 远程连接服务器时&#xff0c;我遇到了两个主要问题&#xff0c;分别是 OpenSSL 版本不匹配和 SSH 私钥文件权限不正确导致连接失败。经过一番尝试&#xff0c;成功解决了这些问题。本文将详细记录解决过程&#xff0c;供大家参考。 问题描述 OpenSSL…

【Android】BottomNavigationView使用的一些小记忆

使用 然后,在 menu 目录下定义 tab 的菜单,例如 res/menu/menu_navigation_tab.xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <menu xmlns:android"http://schemas.android.com/apk/res/android"><itemandroid:id&…

java组件安全

Solr 默认端口&#xff1a;8983 命令执行&#xff08;cve-2019-17558&#xff09; 影响版本&#xff1a;5.0.0-8.3.1 https://github.com/jas502n/solr_rce 远程命令执行&#xff08;cve-2019-0193&#xff09; 影响版本&#xff1a;<8.2.0 条件&#xff1a;DataImport…