gpt4 book ai didi

qt - QString 到 unicode std::string

转载 作者:行者123 更新时间:2023-12-01 09:57:30 31 4
gpt4 key购买 nike

我知道有很多关于转换的信息 QStringchar* ,但我仍然需要对这个问题进行一些澄清。

Qt 提供 QTextCodec s 转换 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

上面的代码如我所料打印了“Юникод”。但我想知道这是否是获得 unicode 的正确方法 char*QString .特别是 reinterpret_cast这种技术中的 s 和大小算术看起来很丑陋。

最佳答案

以下内容适用于 Qt 5。Qt 4 的行为有所不同,并且在实践中被破坏了。

您需要选择:

  • 是否需要 8 位宽 std::string或 16 位宽 std::wstring ,或其他类型。
  • 您的目标字符串需要什么编码?

  • 内部, QString存储 UTF-16 编码数据,因此任何 Unicode 代码点都可以用一两个 QChar 表示s。

    常见情况:
  • 本地编码的 8 位 std::string (如:系统区域设置):
    std::string(str.toLocal8Bit().constData())
  • UTF-8 编码的 8 位 std::string :
    str.toStdString()

    这相当于:
    std::string(str.toUtf8().constData())
  • UTF-16 或 UCS-4 编码 std::wstring , 分别为 16 位或 32 位宽。 16 位与 32 位编码的选择由 Qt 完成以匹配平台的宽度 wchar_t .
    str.toStdWString()
  • C++11 的 U16 或 U32 字符串 - 从 Qt 5.5 开始:
    str.toStdU16String()
    str.toStdU32String()
  • UTF-16 编码的 16 位 std::u16string - 这个 hack 只需要到 Qt 5.4:
    std::u16string(reinterpret_cast<const char16_t*>(str.constData()))

    此编码不包括字节顺序标记 (BOM)。

  • QString 前面添加 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();

    如果您希望字符串很大,则可以跳过一个副本:
    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);

    在这两种情况下, dst现在可移植到具有任一字节序的系统。

    关于qt - QString 到 unicode std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22839964/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com