2

コードページ437のコーデックを作成しようとしています。私の計画は、ASCII文字を通過させ、utf-16値をキーとして使用して、テーブル内の残りの128文字をマップすることでした。

一部の組み合わせ文字(ドット、チルダなどの文字)の場合、文字は2つのQ文字を占有しているように見えます。

プログラムへの引数のutf-16値を出力するテストプログラム:

#include <iostream>
#include <QString>

using namespace std;

void print(QString qs)
{
    for (QString::iterator it = qs.begin(); it != qs.end(); ++it)
        cout << hex << it->unicode() << " ";
    cout << "\n";
}

int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++)
        print(QString::fromStdString(argv[i]));
}

いくつかの出力:

$ ./utf16 Ç ü é
c3 87 
c3 bc 
c3 a9 

期待していた

c387
c3bc
c3a9

QStringで利用可能なさまざまな正規化フォームを試しましたが、デフォルトよりもバイト数が少ないものはありませんでした。

QCharは2バイトであるため、1つのオブジェクトに上記の文字の値を保持できるはずです。QStringが2つのQCharを使用するのはなぜですか?結合されたUnicode値を取得するにはどうすればよいですか?

4

2 に答える 2

3
  1. QString::fromStdStringASCII文字列を想定しており、デコードは行いません。fromLocal8Bit代わりに使用してください。

  2. 期待される出力が間違っています。たとえば、はU + 00C7であるため、C3 87のUTF-8エンコーディングではなくÇ、 C7を期待する必要があります。

main()以下のように変更すると、期待されるUnicodeコードポイントが得られます。各文字について、最初の行にはローカルエンコーディング(ここではUtf-8)がリストされています。これは、基本的に何も実行fromStdStringせず、すべてをまっすぐに渡すためです。2行目は、正しくデコードされたUnicodeコードポイントインデックスを示しています。

$ ./utf16 Ç ü é
c3 87 
c7 
c3 bc 
fc 
c3 a9 
e9 
int main(int argc, char *argv[])
{
    for (int i = 1; i < argc; i++) {
        print(QString::fromStdString(argv[i]));
        print(QString::fromLocal8Bit(argv[i]));
    }
}
于 2012-06-11T10:54:31.643 に答える
0

問題を回避するだけです。QApplicationUnicodeで参照してください。QApplication::argumentsローカルの規則を考慮して、すでにUTF-16でエンコードされています。

于 2012-06-11T14:17:40.760 に答える