Ole*_*nov 3 unicode encoding qstring qt
我知道有很多的信息有关转换QString到char*,但我还是需要一些澄清这个问题.
Qt提供QTextCodecs转换QString(内部存储unicode中的字符)QByteArray,允许我检索char*哪些代表一些非unicode编码中的字符串.但是当我想要一个unicode时我该怎么办QByteArray?
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
Run Code Online (Sandbox Code Playgroud)
上面的代码按照我的预期打印"Юникод".但是,我想知道这是否是去unicode的正道char*的QString.特别是,reinterpret_cast这种技术中的s和大小算术看起来非常难看.
以下内容适用于Qt 5. Qt 4的行为不同,在实践中也被打破了.
你需要选择:
您是想要8位宽std::string还是16位宽std::wstring,还是其他类型.
目标字符串中需要什么编码?
在内部,QString存储UTF-16编码数据,因此任何Unicode代码点都可以用一个或两个QChars表示.
常见情况:
本地编码的8位std::string(如:系统区域设置):
std::string(str.toLocal8Bit().constData())
Run Code Online (Sandbox Code Playgroud)UTF-8编码的8位std::string:
str.toStdString()
Run Code Online (Sandbox Code Playgroud)
这相当于:
std::string(str.toUtf8().constData())
Run Code Online (Sandbox Code Playgroud)UTF-16或UCS-4编码std::wstring,分别为16或32位宽.选择16位与32位编码由Qt完成,以匹配平台的宽度wchar_t.
str.toStdWString()
Run Code Online (Sandbox Code Playgroud)U16或U32 C++ 11字符串 - 从Qt 5.5开始:
str.toStdU16String()
str.toStdU32String()
Run Code Online (Sandbox Code Playgroud)UTF-16编码为16位std::u16string- 这个黑客只需要到Qt 5.4:
std::u16string(reinterpret_cast<const char16_t*>(str.constData()))
Run Code Online (Sandbox Code Playgroud)
此编码不包括字节顺序标记(BOM).
QString在转换BOM 之前,很容易将BOM添加到自身:
QString src = ...;
src.prepend(QChar::ByteOrderMark);
#if QT_VERSION < QT_VERSION_CHECK(5,5,0)
auto dst = std::u16string{reinterpret_cast<const char16_t*>(src.constData()),
src.size()};
#else
auto dst = src.toStdU16String();
Run Code Online (Sandbox Code Playgroud)
如果您希望字符串很大,则可以跳过一个副本:
const QString src = ...;
std::u16string dst;
dst.reserve(src.size() + 2); // BOM + termination
dst.append(char16_t(QChar::ByteOrderMark));
dst.append(reinterpret_cast<const char16_t*>(src.constData()),
src.size()+1);
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,dst现在都可以移植到具有任何字节序的系统.
| 归档时间: |
|
| 查看次数: |
8257 次 |
| 最近记录: |