• QT5.1+中文乱码问题


    原文连接:https://blog.csdn.net/liyuanbhu/article/details/72596952


    QT中规定 QString 的 const char* 构造函数是调用 fromUtf8() 构造的。所以要求字符串字面量是 UTF-8 编码的字节。

    这里先要解释一下下面两个概念:

    • 源码字符集(the source character set):源码文件是使用何种编码保存的
    • 执行字符集(the execution character set):可执行程序内保存的是何种编码(程序执行时内存中字符串编码)

    源码字符集很容易理解,就是我们源代码的编码。为了我们的代码能够跨平台,源文件要保存为带 BOM 的 utf-8。

    执行字符集就麻烦多了。比如我们下面的代码片段:

    QString str("我是中文");

    即使这个文件存为 utf-8 格式了,编译成 exe 文件时,编译器也可能对这个字符串常量进行转码,转为别的编码格式。

    在 gcc 中,控制这个转码操作的命令行参数是:

    -fexec-charset=charset

    如果不指定的话默认是 utf-8。所以我们用 gcc 时很少关注这个问题。

    Viual Stdio 中就麻烦多了。这里先说 Visual stdio 2015,这个是我现在用的编译环境。VS2015 中如果源代码是 utf-8的,执行字符集默认是本地 Locale 字符集,对于简体中文的 windows 系统来说,这个 本地Locale字符集是 gb18030。所以直接显示汉字会全是乱码。解决这个乱码有三个办法,第一个办法是编译时加入命令行参数,在 Qt 的 pro 文件中可以这样:

    msvc:QMAKE_CXXFLAGS += -execution-charset:utf-8

    第二个办法是在源文件中加入:

    #pragma execution_character_set("utf-8")

    更好的办法是源代码写为:

    QString  str(u8"我是中文");

    当然,这里要求编译器支持 C++11,因此上面的代码在 VS2005、VS2008 上是无法编译通过的。

    另外,如果源代码保存为不带 BOM 的 utf-8。那需要告诉 VS2015 我们的编码格式是 utf-8,可以在 pro 文件中加入如下的代码:

    msvc:QMAKE_CXXFLAGS += -source-charset:utf-8

    另外再说说 VS2005、VS2008 下该如何设置。首先这两个编译器都不支持 C++11,也不支持执行字符集的设置,执行字符集就是默认的本地 Locale 字符集。所以我们的代码只能写为:

    QString str = QString::fromLocal8Bit("我是中文");
  • 相关阅读:
    关于python的装饰器(初解)
    关于python的创立模块和导入
    2019年春季学期第五周作业
    2019年春季学期第四周作业
    2019年春季学期第三周作业
    pytest
    Python中if __name__ == '__main__':的作用和原理
    oracle中的游标
    oracle中的一些小知识点
    python中str()与repr()函数的区别
  • 原文地址:https://www.cnblogs.com/linxmouse/p/9560889.html
Copyright © 2020-2023  润新知