一.转换
QString 转 LPCSTR toLocal8Bit
QString 转 LPCWSTR utf16
QString 转 char* toLocal8Bit().data()或toStdString() (在sprintf中用到)
char* 转 QString QString(QLatin1String(ch));
string转QString qstr = QString::fromStdString(str);
string转char数组 c_str()
QString转char数组
char configFilename[MAX_PATH];
memcpy(configFilename,configFile.toLatin1().data(),MAX_PATH);
二.VS
2.1 下载
下载“ForceUTF8(NoBOM)”工具(VS2017连网下载若只是计划安装(不太会用),建议网上单独下载)。
2.2 使用
A.编译默认不修改文件编码方式,只有点击保存才会改编码方式。
B.vs设置(“c/c++”,“命令行”,"其它选项 “后面添加”/utf-8 "),猜测同时设源码字符集、执行字符集为utf-8
三.QtCreator
#pragma execution_character_set("utf-8")
使用该方式的源码文件,在VS2017中编译会报错(个人在vs中会屏蔽上面这句)。
同时可能出现另一编译报错(中文字为单数个之类的),暂改用步骤四方法解决。
四.cmake
add_compile_option("/utf-8")
猜测类似设置VS字符集。
五.编码知识
源码字符集:源码文件是使用何种编码保存的
执行字符集:可执行程序内保存的是何种编码(程序执行时内存中字符串编码)
文件字符集:
编译器字符集:VS-cl(GBK),Mingw-g++(utf-8),Linux-g++(utf-8BOM)
操作系统字符集:大陆简体中文windows(GBK/local8Bit),港澳台windows(BIG5),欧洲windows(Latin-1),Linux(一般utf-8)
Qt5中QString内部采用unicode字符集,utf-16编码。构造函数QString::QString(const char *str)默认使用fromUtf8(),将str所指的执行字符集从utf-8转码成utf-16。
由上面fromUtf8()可知,QString需要执行字符集编码为utf-8,然后以utf-8进行解码,再编码为utf-16才能获得正确的字符编码。
显示中文乱码的原因其实就是QString转码方式与执行字符集不一致。(比如,源字符集为本地字符集GBK编码,QString以utf-8的方式进行解码,会导致获得错误的二进制编码,再将错误二进制转为utf-16就会出现乱码。)
所以这可能就是#pragma execution_character_set(“utf-8”)再同时用QString::fromlocal8bit会乱码的原因,fromlocal8bit可能会因为不再是local8bit冲突。
六.参考链接
qstring乱码 qt4_QString::QString 中文乱码
谈QString
彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)