QString来unicode std :: string

Ole*_*nov 3 unicode encoding qstring qt

我知道有很多的信息有关转换QStringchar*,但我还是需要一些澄清这个问题.

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和大小算术看起来非常难看.

Rei*_*ica 5

以下内容适用于Qt 5. Qt 4的行为不同,在实践中也被打破了.

你需要选择:

  1. 您是想要8位宽std::string还是16位宽std::wstring,还是其他类型.

  2. 目标字符串中需要什么编码?

在内部,QString存储UTF-16编码数据,因此任何Unicode代码点都可以用一个或两个QChars表示.

常见情况:

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现在都可以移植到具有任何字节序的系统.