【发布时间】:2014-04-03 13:56:06
【问题描述】:
我知道有很多关于将QString 转换为char* 的信息,但我仍然需要对这个问题进行一些澄清。
Qt 提供QTextCodecs 将QString(内部以unicode 存储字符)转换为QByteArray,允许我检索char*,它表示某些非unicode 编码的字符串。但是当我想得到一个unicodeQByteArray时应该怎么做呢?
QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QString qstr = codec->toUnicode("Юникод");
std::string stdstr(reinterpret_cast<const char*>(qstr.constData()), qstr.size() * 2 ); // * 2 since unicode character is twice longer than char
qDebug() << QString(reinterpret_cast<const QChar*>(stdstr.c_str()), stdstr.size() / 2); // same
如我所料,上面的代码打印出“Юникод”。但我想知道这是否是获取QString 的unicode char* 的正确方法。特别是,这种技术中的reinterpret_casts 和大小算术看起来很丑。
【问题讨论】:
-
@ratchetfreak 你的意思是 UTF8 和 Unicode 是平等的?
-
UTF8 是字节大小的 unicode 格式,内部 QString 使用 UTF16,你也可以获取
data() -
QString 已经是“юникодед”。所以只需致电
str.toStdWString()。std::string不是为存储 16 位字符而设计的。 -
"你的意思是 UTF8 和 Unicode 是相等的" 不,你使用 Unicode 这个词是错误的。 Unicode 不是一种编码,它是一种标准,因此谈论“Unicode std::string”没有任何意义。字符串本身不能与 Unicode 兼容。
std::string将具有特定的“字符”类型(通常为 8 位或 16 位宽),并且将具有特定的编码(通常为 16 位字符的 UCS-2 或 UTF-16)。 UCS-2 和 UTF-16 之间的最大区别在于 UCS-2 是固定宽度的:每个“字符”一个代码点。在 UTF-16 中,每个代码点可能有多个“字符”。 -
短语“unicode QByteArray”没有意义。相当于说“wakalixes QByteArray”。字节数组可以携带一些 8 位编码的文本数据,例如 Latin1 (ISO/IEC 8859-1) 或 UTF-8 等。如果你想要一个 8 位编码的字节数组作为字符串的表示, 你需要知道这样一个数组的用户期望什么编码。只有这样你才能决定如何对字符串进行编码。
标签: qt unicode encoding qstring