【问题标题】:Get QString length (in characters, not bytes)获取 QString 长度(以字符为单位,而不是字节)
【发布时间】:2012-12-22 01:04:31
【问题描述】:

我需要获取实际的字符数(不是字节数),类似于 V8 中获取字符串长度时的输出。

这对于使用 Twitter 是必需的,无论使用什么语言,它都会按字符数计算,即使是 UTF-8(它不按字节长度计算)。

例如:

在 chrome/chromium js 控制台中,或在 nodejs 中:

> "Schöne Grüße".length
< 12

在 Qt 4.8.2 中,尝试QString someStr = "Schöne Grüße"; cout &lt;&lt; someStr.length() 将输出 15,这不是我的目标。

【问题讨论】:

  • 我想知道 Twitter 对组合变音符号做了什么 - 它是否将这些内容计入“字符数”? 8-P
  • ...哦they don't!

标签: c++ qt qstring


【解决方案1】:

如果你真的想计算字素簇(即用户感知的字符)而不是代码单元,你需要QTextBoundaryFinder。下面是一个使用示例:

#include <iostream>
#include <QTextBoundaryFinder>
#include <QString>

int main()
{
    const QString s=QString::fromUtf8(u8"abc\U00010139def\U00010102g");
    std::cout << "String: \"" << s.toStdString() << "\"\n";
    std::cout << "Code unit count       : " << s.length() << "\n";

    QTextBoundaryFinder tbf(QTextBoundaryFinder::Grapheme, s);
    int count=0;
    while(tbf.toNextBoundary()!=-1)
        ++count;
    std::cout << "Grapheme cluster count: " << count << "\n";
}

输出:

String: "abc?def?g"
Code unit count       : 11
Grapheme cluster count: 9

【讨论】:

    【解决方案2】:

    我相信您需要使用特定的fromUtf8 static method 来构建它:

    QString s = QString::fromUtf8("Schöne Grüße");
    

    【讨论】:

    • 点,就是这样,谢谢。希望它适用于日文和其他 unicode 字符,但我们会看到的。 :)
    • Qstring 内部是 utf16,但处理与 utf8 之间的转换
    • 如果您随后使用QString::length,那么您将得到u8"?" 字符串的2,这是对OP 的错误回答。
    • @Ruslan,我刚刚在 Qt4 和 Qt5 中对此进行了测试,在这两种情况下,无论有没有 u8,我的长度都是 1。
    • 您在测试中使用了# 还是??它们不一样:前者是U+0x0023,而后者是U+0x10139。
    猜你喜欢
    • 1970-01-01
    • 2013-05-07
    • 2012-04-09
    • 2013-02-26
    • 2013-06-28
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    相关资源
    最近更新 更多