字符集和编码方式; QT乱码问题

Windows下VS和Qt编码

国内windows电脑使用vs时,默认创建的源码文件编码方式是GBK(BG2312);
QCreater创建的源码文件默认的编码方式是UTF-8;

我们单独使用vs编写控制台程序时,源码使用的就是vs默认的编码方式GBK,一般我们保存字符串使用的std::string(仅仅是对char的一个封装)和char会使用系统默认的编码和解码方式也就是GBK,GBK是支持中文的,所以不需要做任何设置就可以在代码中很好的支持中文字符串运行。
单独使用QCreater时,编码和解码方式都是utf-8,编码解码方式一样,同样可以正常运行。

VS和QT同时使用

VS和Qt同时使用,只有在Windows系统下会出现,Linux不存在这个问题,linux下直接用QCreater即可。
这种情况下源码可以是BGK,UTF-8,UTF-8-BOM。GKB没有测试过、

使用UTF-8

因为是QT默认的编码方式一样 ,QString可以很好的支持汉语,但是windows下string的解码需要使用BOM(字节序信息)来判断编码方式,而UTF-8没有这个字节序信息,所以string使用汉语时就会出现乱码(char一样)。目前没有找到好的方式解决这个问题。

使用UTF-8-BOM

使用BOM字节序信息存储源码,那么string在解码的时候就会告知编译器使用的是utf-8的编码方式,出现中文就可以正确解析。但是QString默认不支持带BOM的形式,会出现中文乱码。
解决方式:在CMakelist.txt文件中加入编译选项,告知编译器把源文件当成utf-8处理。

# 对于msvc,默认将所有源文件都当成utf-8来处理(需要先手动将所有文件保存成utf-8)(Qt的tr需要utf-8if(WIN32)
  target_compile_options(${VDA_FULL_FIELD_APP_NAME} PRIVATE "$<$:/utf-8>")
  target_compile_options(${VDA_FULL_FIELD_APP_NAME} PRIVATE "$<$:/utf-8>")
endif()

总结:

qt+vs使用:源码编码方式为:utf-8-bom。同时加上编译选项。

最终效果:QString,Qobject:tr(),char*,std::String均可支持中英文使用

其他方式

一种是使用QStringLiteral()宏封装字符串,
另一种方法是强制MSVC编译器生成的可执行文件使用UTF-8编码

其他:

BOM即byte order mark ,中文名译作“字节顺序标记”。BOM是为UTF-16和UTF-32准备的,用户标记字节序(byte order)。拿UTF-16来举例,其是以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。如果我们收到UTF-16字节流"594E",那么这是“奎”还是“乙”?
UTF-8是以字节为编码单元,没有字节序的问题。
Windows 就是使用 BOM 来标记文本文件的编码方式的**。
不含BOM的UTF-8才是标准形式,UTF-8不需要BOM

参考文档: UTF-8与UTF-8(BOM)区别和一些说明

你可能感兴趣的:(qt,软件编码,qt,c++)