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