3

アプリケーションをJava+SwingからC+++Qtに変換しようとしています。ある時点で、私はいくつかのUnicode中間体を扱わなければなりませんでした。Javaでは、これはかなり簡単でした。

private static String[] hiraganaTable = {
    "\u3042", "\u3044", "\u3046", "\u3048", "\u304a", 
    "\u304b", "\u304d", "\u304f", "\u3051", "\u3053", 
    ...
}

... C ++では問題が発生します:

QString hiraganaTable[] = {
    "\x30\x42", "\x30\x44", "\x30\x46", "\x30\x48", "\x30\x4a", 
    "\x30\x4b", "\x30\x4d", "\x30\x4f", "\x30\x51", "\x30\x53", 
    ...
};

次の形式の警告のヒープを取得したため、VS2008では\uを使用できませんでした。

ユニバーサル文字名'\u3042'で表される文字は、現在のコードページ(1250)では表現できません

そして、私を愚かとは言わないでください。私は[ファイル]-> [高度な保存オプション]を使用しようとしましたが、コードページはまったく変更されていないようです。これは既知の問題のようです:Visual C++2008でUTF-8文字列リテラルを作成する方法

私が使用しているテーブルはかなり短いので、Vimといくつかの入門レベルの正規表現マジックの助けを借りて、それを\ x30\x42表記に変換することができました。残念ながら、QStringsはそのような入力から適切に初期化されませんでした。私はすべてを試しました。fromAscii()、fromUtf8()、fromLocal8Bit()、QString(QByteArray)、動作します。次に、BOMなしでU + 3042をファイルに書き込んでから、16進モードで表示しようとすると、実際には「E38182」であることがわかりました。突然、このようなエントリはQString :: fromAscii()で機能するように見えました。ここで、「U+」は「U+ 3042」で正確にどのくらいの意味があるのか​​疑問に思います(0xE38182-0x3042 = E35140なので、このマジック定数をすべてのUnicode文字に追加したほうがいいでしょうか?)。適切なUTF-8文字列の配列を取得するには、ここからどのように進めればよいですか?

4

3 に答える 3

4

問題は、C++がASCII時代にさかのぼるCに基づいていることです。「デフォルト」のC文字列「abc」は8ビットです。ただし、Visual C ++コンパイラには16ビットUnicode(UTF-16)リテラルがあり、構文は少し異なりますL"abc\u3042"。このようなリテラルのタイプはではwchar_t[N]なく、char[N]に格納できますstd::wstring

Qtは完全に理解wchar_tしており、変換の問題なしにQStringを直接構築できます。

于 2010-11-24T09:18:39.443 に答える
4

表示されているのは、その文字の UTF-8 エンコーディングです。

>>> u'\u3042'.encode('utf-8').encode('hex')
'e38182'

全部UTF-8で書けば大丈夫です。

「U+」は、特定のエンコーディングではなく、Unicode コードポイントを見ていることを示しています。

編集:

Python での開始に役立つ小さなスクリプトレット (上記と同じ言語):

>>> print ',\n'.join(', '.join('"%s"' % (y.encode('utf-8').encode('string-escape')
      ,) for y in x) for x in [u'あいうえお', u'かきくけこ', u'さしすせそ'])
"\xe3\x81\x82", "\xe3\x81\x84", "\xe3\x81\x86", "\xe3\x81\x88", "\xe3\x81\x8a",
"\xe3\x81\x8b", "\xe3\x81\x8d", "\xe3\x81\x8f", "\xe3\x81\x91", "\xe3\x81\x93",
"\xe3\x81\x95", "\xe3\x81\x97", "\xe3\x81\x99", "\xe3\x81\x9b", "\xe3\x81\x9d"
于 2010-11-23T23:15:44.067 に答える
2

dが 16 進数である"U+ dddd " は、Unicode コード ポイントを示します。

16 ビット値を 8 ビット文字に格納することはできません。それがあなたが抱えている主な問題です。

ワイド文字を使用します (これらは文字列リテラルです)L"\0x3042"またはL"\u3042".

次に、QString がそれらを受け入れるようにする方法を考え出します。

注: Visual C++ は、\Uリテラル内で使用される表記法に対して愚かな警告を発しますが、g++ は、リテラルの外で使用される表記法に対して愚かな警告を発します。

乾杯 & hth.,

于 2010-11-24T00:21:48.643 に答える