0

次の形式で、2 つのエンコーディング セット (関連なし: Unicodeと GB18030 ) 間のマッピング Nx2 があります: icu/データ/トランク/文字セット/データ/xml/gb-18030-2000.xml

スナップショット:

<a u="00B7" b="A1 A4"/>
<a u="00B8" b="81 30 86 30"/>
<a u="00B9" b="81 30 86 31"/>
<a u="00BA" b="81 30 86 32"/>

b 値 (右列) をデータ構造に保存し、a 値 (左列) に基づくインデックスを使用して (検索なしで) 直接アクセスしたいと考えています。

例:

これらの要素を次のようなデータ構造に格納できます。

unsigned short *my_page[256] = {my_00,my_01, ....., my_ff}

要素は次のように定義されます。

static unsigned short my_00[256] など

. したがって、基本的にはマトリックスのマトリックス => 256x256 = 65536 の利用可能な要素です。

要素が少なく、値が異なる他のエンコーディング (例: 中国語の Big5、日本語の Shift、韓国の KSC など) の場合、次のような全単射関数を使用して要素にアクセスできます。

element = my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF];ここでunicode[i] は、マッピングからのa のような要素で埋められます (上記のとおり)。my_page 構造を生成して埋める方法は似ています。作業中のエンコーディングについては、約 7000 文字を保存する必要があります (それらは my_page の一意の場所に保存されます)。

問題は GB18030 エンコーディングにあり、my_page に 30861 要素 (65536 要素) を格納しようとします。同じ全単射関数を使用して my_page 構造体を埋めようとしています (そして同様にアクセスします) が、アクセス モードが一意の結果を返さないため失敗します。

例: Unicode 値の場合、たとえばii+1my_page[(unicode[i]>>8)&0x00FF][unicode[i]&0x00FF]のインデックスが同じになる可能性があるため、複数の要素にアクセスできます 。私がやろうとしていたように、事前に計算されたインデックスのみに基づいて my_page 構造内の要素にアクセス/入力する別の方法を知っていますか?

値の範囲 VRangeを返す疑似ハッシュ関数のようなものを使用する必要があると仮定し、一連のルールに基づいて範囲 VRange から my_page[256][256] の整数インデックスを抽出できます。

何かアドバイスがあれば、教えてください:)

ありがとうございました !

4

1 に答える 1

0

GB18030 については、次のドキュメントを参照してください: http://icu-project.org/docs/papers/gb18030.html

この記事で説明されているように、「有効なバイト シーケンスの数 (対象となる Unicode コード ポイントとそれらの間で定義されたマッピング) により、通常の純粋にマッピング テーブル ベースのコードページ コンバーターを直接使用することは現実的ではありません。約 110 万のマッピングがあるため、単純なマッピング テーブルのサイズは数メガバイトになります。」そのため、純粋なマッピング テーブルに基づいて変換を実装するのはおそらく適切ではありません。大きなパーツの場合、GB18030 と Unicode の間に直接マッピングがあります。4 バイト文字のほとんどは、アルゴリズムで変換できます。この記事の著者は、そのような範囲を特別なコードで処理し、他の範囲を従来のマッピング テーブルで処理することを提案しています。これらの文字は、XML マッピング テーブルで指定されているものです: http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml

したがって、C++ の行列のような構造に対するインデックスベースのアクセスは、そのような全単射関数を研究したい人にとっては、開かれた問題になる可能性があります。

于 2015-03-26T10:36:08.977 に答える