Qt开发经验 --- 避坑指南(5)
文章目录
- @[toc]
- 1 Qt Windows下中文乱码解决方式
- 2 编码选择
- 3 QString转QByteArray
- 4 qmake编译`Missing closing " quote`错误
文章目录
- @[toc]
- 1 Qt Windows下中文乱码解决方式
- 2 编码选择
- 3 QString转QByteArray
- 4 qmake编译`Missing closing " quote`错误
更多精彩内容 |
---|
👉内容导航 👈 |
👉Qt开发经验 👈 |
1 Qt Windows下中文乱码解决方式
乱码原因
- 当>=MSVC2013编译器编译程序的时候,会分析源文件采用何种编码,有BOM标识符则可以正确识别其编码,若没有BOM标识符则认为其使用本地字符编码local字符集。我们使用的windows系统本地字符编码为GBK编码。
- Local字符集是什么?取决于你的设置
QTextCodec *codec = QTextCodec::codecForName(???)
; - 如果源文件是UTF-8+BOM的编码方式,还需要在头文件加入
- 使用qtcreator创建main.cpp,它默认代码里的汉字使用utf8字符集。msvc编译器默认汉字使用gb18030字符集
解决办法
-
方法1:在QtCreator中打开工具->选项->文本编辑器->文本编码,默认编码设置为tuf-8,UTF-8 BOM设置为总是删除;
-
办法2:在
.pro
文件中添加下列代码,注意不能与方法3同时使用,否则编译失败;-
只能在msvc编译器下使用,否则编译失败
-
如果要同时将源字符集和执行字符集设置为 UTF-8,可以使用
/utf-8
编译器选项作为快捷方式。 它等效于命令行上的/source-charset:utf-8 /execution-charset:utf-8
。 这些选项中的任意选项都默认启用/validate-charset
选项。在MSVC 2015中,
/utf-8
选项是从14.0.23506
版本开始支持的。因此,只有MSVC 2015 Update 3及更高版本的编译器才支持
/utf-8
选项。如果您的MSVC 2015版本低于14.0.23506,那么您需要升级到最新的版本才能使用/utf-8选项。
您可以通过“帮助”->“关于Microsoft Visual Studio”菜单来查看您的MSVC 2015版本号。如果您的版本号低于14.0.23506,可以尝试升级到最新的更新版本,或者使用其他选项来指定源文件的字符集编码。
# 使用utf-8编码 msvc { QMAKE_CFLAGS += /utf-8 QMAKE_CXXFLAGS += /utf-8 }/* VS2010 记得一定要打上SP1补丁*/ //VC2010~2015 必须加入这行预编代码 // 此编译器指令在 Visual Studio 2015 Update 2 及更高版本中已过时 #pragma execution_character_set("utf-8")#VS2017 必须在编译器中设置,这是QT的PRO设置,source-charsetr指源代码、execution-charset编译后的程序或库,可以直接加入 QMAKE_CXXFLAGS += /utf-8 contains( CONFIG, "msvc" ): QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 contains( CONFIG, "msvc" ): QMAKE_CFLAGS += /source-charset:utf-8 /execution-charset:utf-8#VS2017 必须在编译器中设置,这是QT的PRO设置, 直接/utf-8时,有些编译器不支持 contains( CONFIG, "msvc" ): QMAKE_CXXFLAGS += /utf-8 contains( CONFIG, "msvc" ): QMAKE_CFLAGS += /utf-8
- 详情
-
-
办法3:在源文件中添加
#if defined(_MSC_VER) && (_MSC_VER >= 1600) # pragma execution_character_set("utf-8") #endif// main函数中添加//设置中文编码 #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0)) #if _MSC_VERQTextCodec *codec = QTextCodec::codecForName("gbk"); #elseQTextCodec *codec = QTextCodec::codecForName("utf-8"); #endifQTextCodec::setCodecForLocale(codec);QTextCodec::setCodecForCStrings(codec);QTextCodec::setCodecForTr(codec); #elseQTextCodec *codec = QTextCodec::codecForName("utf-8");QTextCodec::setCodecForLocale(codec); #endif
-
如果源文件是
UTF-8+无BOM
的编码方式,则一定不能加#pragma execution_character_set(“utf-8”)
,不然会产生乱码。 -
综上所述,解决Qt5中文乱码的一个比较好的方式,源文件设置BOM标识的utf-8编码,执行字符集为设置为utf-8。这样源字符集,执行字符集都是一致。
2 编码选择
- 如果该工程不需要跨平台使用(只在win),那么工程设置请使用GBK的编码方式.
- 如果该工程要跨平台使用(win+linux),那么工程设置请使用UTF-8+BOM的编码方式,并在文件中添加
# pragma execution_character_set("utf-8")
;- 但是需要注意的时utf-8 bom编码会在文件头部默认添加3个字符,这三个字符会导致一些问题,如css样式表失效或加载GLSL文件失效。
3 QString转QByteArray
三种方式
- toUtf8() :输出UTF-8编码的字符集
- toLatin1():ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF。亦称为Latin1,中文返回?
- toLocal8Bit():是本地操作系统设置的字符集编码或
QTextCodec::setCodecForLocale(codec);
指定的编码
QString str("Hello World 你好");
QByteArray bytes = str.toUtf8(); // QString转QByteArray方法1
QByteArray bytes = str.toLatin1(); // QString转QByteArray方法2
QByteArray bytes = str.toLocal8Bit(); // QString转QByteArray方法3
4 qmake编译Missing closing " quote
错误
- Mingw编译器,QtCreator10.04,Qt5.14.2就会报错误
- 如果使用MSVC就不会
- 是由pro文件中有中文,并且文件编码格式不对导致的,使用文本编辑器打开文件,设置为utf-8 bom就可以了。