7

私はあらゆる種類の文字を処理し、ある時点でそれらに関する情報を表示することになっているアプリケーションを持っています。QChar、QStringなどでQtとその固有のUnicodeサポートを使用しています。

ここで、http://unicode.org/Public/UNIDATA/UnicodeData.txtでデータを検索するために、 QCharのコードポイントが必要ですが、QCharのunicode()メソッドはushort(unsigned short)のみを返します。 0から65535(または0xFFFF)までの数値です。コードポイントが0xFFFFを超える文字がありますが、これらを取得するにはどうすればよいですか?私が見逃しているトリックはありますか、それとも現在Qt / QCharでサポートされていませんか?

4

3 に答える 3

7

それぞれQCharがUTF-16値であり、完全なUnicodeコードポイントではありません。したがって、非BMP文字は2つのQCharサロゲートペアで構成されます。

于 2011-08-07T12:43:57.917 に答える
3

解決策は、文書化されているがWebではあまり見られないコードにあるように見えます。utf-8値は10進形式で取得できます。次に、1つのQCharが十分に大きいかどうかを判断するために適用します。この場合はそうではありません。次に、2つのQCharを作成する必要があります。

uint32_t cp = 155222; // a 4-byte Japanese character 
QString str;
if(Qchar::requiresSurrogate(cp))
{
    QChar charArray[2];
    charArray[0] = QChar::highSurrogate(cp);
    charArray[1] = QChar::lowSurrogate(cp);
    str =  QString(charArray, 2);
}

結果のQStringには、補足utf-8文字を表示するための正しい情報が含まれます。

于 2017-04-21T16:47:06.253 に答える
2

QtのU+FFFFを超えるUnicode文字

QCharそれ自体は、までのUnicode文字のみをサポートしますU+FFFF

QString2つのQCharU+FFFFを連結する(つまり、UTF-16エンコーディングを使用する)ことにより、Unicode文字をサポートします。ただし、を超える文字を処理する必要がある場合、QStringAPIはあまり役に立ちません。例として、単一のUnicode文字を含むQStringインスタンスは、1ではなく2のサイズを返します。U+FFFFU+131F6

私は2011年にこの問題についてQTBUG-18868を開きましたが、3年以上(!)の議論の末、解決策なしに「範囲外」として最終的に閉じられました。

解決

ただし、 Qtバグレポートに添付されているこれらのUnicodeQt文字列ラッパークラスをダウンロードして使用することはできます。LGPLの下でライセンスされています。

このダウンロードには、ラッパークラス、、が含まれていますQUtfString。これらのクラスはQUtfChar、既存のQtクラスQUtfRegExpQUtfStringList補完し、次のようなことを可能にします。

QUtfString str;
str.append(0x1307C);            // Some Unicode character beyond U+FFFF

Q_ASSERT(str.size() == 1);
Q_ASSERT(str[0] == 0x1307C);

str += 'a';

Q_ASSERT(str.size() == 2);
Q_ASSERT(str[1] == 'a');
Q_ASSERT(str.indexOf('a') == 1);

実装、使用法、および実行時の複雑さの詳細については、ダウンロードに含まれているAPIドキュメントを参照してください。

于 2014-04-04T10:28:23.867 に答える