• qt4 中文乱码处理


    UCS-2, UTF-8 和 UTF-16

    ● Unicode 编码刚开始的时候, 曾经只有 65536 个字符空间。这个空间被称为「基本多文种平面」。用恒定的两个字节表示所有字符,这种编码方式被称为 UCS-2 。
    ● 当 Unicode 字符超过 65536 之后,参考「多字节编码」,通过双字节扩展四字节的方式表示所有字符。这种编码方式被称为 UTF-16 。
    ● 为了便于网络传输和数据处理,不至于因为遇到“ \0” 而错误地以为文本结束,以及兼容 ASCII 码, UTF-8 被定义。 UTF-8 的每一个字符按规则编码为 1 ~ 4 任一字节组合。中文通常为 3 字节长。
    ● 当然,也有直接使用 4 字节编码所有字符的编码方式,被称为 UTF-32 或者UCS-4 。

    Windows 的历史遗留问题

    ● 在 Unicode 尚未成熟的年代, Windows 是使用各个国家的多字节编码,来支持每个国家的语言的。
    ● 自 WinNT 发布之后, Windows 内核的 API 全部改成使用UTF-16 的编码方式,以更好地支持多语言。但是由于历史原因, Windows 仍然保留多字节编码的 API 。 UTF-16 的 API以 W 结尾,而多字节编码以 A 结尾。
             例如 CreateWindowA 和 CreateWindowW 。

    源文件中的「多字节编码」是什么?

    ● 如果不特别说明, Qt 4.x 会认为源文件的编码是 Latin-1 (西欧语言多字节编码)。当然, Qt 5.x 已经修正这个坏习惯,默认源文件是 UTF-8来着。不过谁叫我们现在还在用 4.8 呢?

    ● 就像 std::string 做的一样, QString 可以在必要的时候由 const char* 隐式 或 显 式 转 换 而 成 。 这 个 过 程 中 使 用 的 编 码 , 就 是QTextCodec::codecForCStrings 。
    ● Qt 有一个函数, QObject::tr ,也可以将 const char*  转换为 QString 。这个过程中使用的编码方式由 QTextCodec::codecForTr 指定。
    ● 另外 QTextCodec::codecForLocale 表明当前系统所用编码。一般中文Windows 应该是 GBK 。中文 Linux 则一般为 UTF-8 。

    那么到底如何解决中文乱码问题呢?

    1、 Qt Creator 保存源文件的编码:

    2、main中添加

    1. QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
    2. QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8"));

     

  • 相关阅读:
    【c++刷题Day3】专题3T2
    js 数组相同的数据合并,并返回数据个数
    分布式系列分布式计算框架Hadoop核心组件概述
    动态内存管理(1)
    初识散列表
    手写商用Java虚拟机HotSpot,疯狂磨练技术中
    CSDN21天学习挑战赛之选择排序
    并发编程中常见的设计模式,c++多线程如何设计
    关于初始化page入参的设计思路
    图论例题解析
  • 原文地址:https://blog.csdn.net/weixin_43777852/article/details/125481792