乱码

因此以下几行等价(以 UTF-8 编码保存 C++ 源文件):

const char s1[] = " 最喜欢 C++ 了! "; 
const char s2[] = "\xe6\x9c\x80\xe5\x96\x9c\xe6\xac\xa2\x43\x2b" "\x2b\xe4\xba\x86\xef\xbc\x81"; 
const char s3[] = { 0xe6, 0x9c, 0x80, 0xe5, 0x96, 0x9c, 0xe6, 0xac, 0xa2, 0x43, 0x2b, 0x2b, 0xe4, 0xba, 0x86, 0xef, 0xbc, 0x81, 0x00 };

在兼顾了计算性能和存储性能之后, Qt 小组决定 将 UTF-16 作为 QString 的编码格式

源代码中出现的中文字符串常量,在被 Qt 使用之前, 都经历了一次由「多字节编码」转换为 UTF-16 的过程

QString 可以在必要的时候由 const char* 隐 式 或 显 式 转 换 而 成 。 这 个 过 程 中 使 用 的 编 码 , 就 是 QTextCodec::codecForCStrings

Qt 有一个函数, QObject::tr ,也可以将 const char* 转换为 QString 。 这个过程中使用的编码方式由 QTextCodec::codecForTr 指定

Qt 读取文件可以用任何一种编码,只是默认以 codecForLocale 而已

// 我们的源文件是 UTF-8 格式的,因此建立一个 QString 。
QString s = QString::fromUtf8(" 这是 UTF-8 的字符串 ");
// 将 QString 转换为 GBK 格式的 QByteArray 字符数组。
// QByteArray::data() 可以拿到 const char* 。
QByteArray gbk_s = QTextCodec::codecForName("gbk")->fromUnicode(s);
// 然后再从 GBK 字符数组转换回 QString 。
QString s2 = QTextCodec::codecForName("gbk")->toUnicode(gbk_s);