Мне нужно получить фактическое количество символов (не число байтов), подобное тому, что выводится при получении длины строки в 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 << someStr.length()
выдаст 15, что не то, к чему я стремлюсь.
Я считаю, что вам нужно построить его, используя конкретные fromUtf8
статический метод:
QString s = QString::fromUtf8("Schöne Grüße");
Если вы действительно хотите считать графемные кластеры (то есть воспринимаемые пользователем символы) вместо единиц кода, вам нужно 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: "abcdefg"Code unit count : 11
Grapheme cluster count: 9