以下、図1ないし図29を参照して本発明の実施例について説明する。なお、この分野の精通者ならば理解されるように、これらの図を参照して以下に詳述する説明は本発明の理解を容易にすることを目的とし、本発明は以下に説明する実施例に限定されるものではない。
本発明の第1側面によるコード変換システムはソース文字を異なるコード化のターゲット文字に変換するものである。本発明によるコード変換システムはラウンドトリップ忠実度を備えていると共に、その結果の文字コードが他のプラットフォームと互換性をもつことを保証する。コード変換システムは単一ソース文字または文字シーケンスを単一ターゲット文字またはターゲット文字シーケンスのどちらかにマッピングする機能を備えている。ラウンドトリップ忠実度により、ソース・テキストはターゲット・テキストに変換し、そのあとオリジナル・ソース・テキストに戻すように再変換することができる。その結果の文字コードが他のプラットフォームと互換性をもつことは、標準ターゲット文字の使用を最大限にし、プライベート文字の使用を最小限にすることによって保証される。コード変換システムは他の文字セットからユニコード文字に変換し、ユニコード文字を他の文字セットに変換するときに利用すると、特に便利である。ユニコード文字シーケンスをターゲット文字セット内の単一文字にマッピングすることは従来にはなかったものである。
コード変換システムはコンピュータ・システムや他のエレクトロニック・デバイスにしてこれらのコード変換オペレーションを行うことができる。このコンピュータ・システムは必要とする目的だけに使用するように構築することも、コンピュータ・プログラムに従って動作する汎用コンピュータにすることも可能である。以下に説明する処理はどのコンピュータ・システムや他のエレクトロニック・デバイスにも適用可能である。具体的には、種々の汎用コンピューティング・マシンは以下に教示する説明に従って書かれたソフトウェアと共に使用することができるが、もっと特殊化されたエレクトロニック・デバイスを構築すると、必要とするオペレーションを実行できるので好都合である。
本発明の第2側面によるコード変換システムはソース文字コード化からの文字をターゲット文字コード化に変換するとき方向を考慮に入れる。このコード変換システムは単一ソース文字または文字シーケンスを単一ターゲット文字またはターゲット文字シーケンスにマッピングする機能を備えている。変換される文字の方向を判断または解明することにより、コード変換システムは判断または解明された文字の方向を利用してターゲット文字コード化への正しいマッピングが得られることを保証する。従って、本発明によれば、ソース文字列内の文字の方向が変化するときでも正しいコード変換が達成される。
本発明がアラビアまたはヘブライ・ベースの文字セットが使用されるときに特に便利であるのは、これらの文字が右から左への方向をもっているからである。本発明によれば、どちらかの方向を取り扱うときの柔軟性が得られるだけでなく方向を途中で変更できるという機能も得られる。方向を途中で変更できることはアラビア文字および/またはヘブライ文字が左から右への方向が最も普通である他の文字セットと一緒に使用されるような場合に重要である。異なる方向をもつ文字の使用例として、スペース文字がある。ユニコードでは、コード化は1つだけであり、固有の方向をもっていない。他方、MacArabicでは、左から右へのスペース文字と右から左へのスペース文字の2種類がある。
変換されるソース文字の方向を判断または解明することは、方向解明手法によって達成されるが、この手法についてはソース文字を異なるコード化のターゲット文字に変換するコード変換システムと関連づけて以下で詳しく説明する。
本発明の第3側面によるコード変換システムはソース文字コード化からの文字をターゲット文字コード化に変換するときコンテキストを考慮に入れる。このコード変換システムは単一ソース文字または文字シーケンスを単一ターゲット文字またはターゲット文字シーケンスのどちらかにマッピングする機能を備えている。文字のコンテキストを判断することにより、コード変換システムは判断された文字のコンテキストを利用してターゲット・コード化への正しいマッピングが得られることを保証する。従って、本発明によれば、文字のコンテキストがターゲット・コード化へのマッピングに影響するときでも正しいコード変換が達成される。
ある種の文字セットでは、文字が使用されているコンテキストによって文字が異なる表現形態をもつことになる。これらの文字の表現形態は絵文字(glyphs)である。異なる表現形態は表示されるとき異なって現れる。文字が使用されているコンテキストによって表現形態が決まる。アラビア文字はそのコンテキストに応じて異なる表現形態をもつ言語である。
アラビア・スクリプトはアラビア語を書くために使用される。アラビア・スクリプトはその印刷形体においても筆写体(カーシブ)である。その結果として、同じ文字はそれが隣の文字とどのように結合されるかに応じて異なった形体で書かれることがある。このような文字の例として、アラビア文字“HEH”(ユニコード文字ではu0647とコード化される)がある。例えば、ユニコードでのアラビア文字はDOSアラビア文字の4つの異なる表現形態の1つをコンテキストに応じてマッピングされる場合がある。その結果、本発明によるコード変換システムはユニコード・ストリーム内のアラビア文字のコンテキストを判断し、正しいマッピングが得られるように動作する。
変換されるソース文字のコンテキストの判断はコンテキスト処理によって達成されるが、このコンテキスト処理はソース文字を異なるコード化のターゲット文字に変換するコード変換システムと関連づけて以下で詳しく説明する。
本発明の第2および第3側面によれば、コード変換システムはソース文字を異なるコード化のターゲット文字に変換する。本発明によるコード変換システムはラウンドトリップ忠実度を提供すると共に、その結果の文字コードが他のプラットフォームと互換性をもつことを保証する。コード変換システムは単一ソース文字または文字シーケンスを単一ターゲット文字またはターゲット文字シーケンスのどちらかにマッピングする機能を備えている。ラウンドトリップ忠実度によると、ソース・テキストはターゲット・テキストに変換し、そのあとオリジナル・ソース・テキストに戻るように再変換することができる。その結果の文字コードと他のプラットフォームとの互換性は標準ターゲット文字の使用を最大限にし、プライベート文字の使用を最小限にすることによって保証される。コード変換システムは他の文字セットからユニコード文字に変換し、ユニコード文字を他の文字セットに変換するときに利用すると、特に便利である。ユニコード文字シーケンスをターゲット文字セット内の単一文字にマッピングすることは従来にはなかったものである。
コード変換システムはコンピュータ・システムや他のエレクトロニック・デバイスにしてこれらのコード変換オペレーションを行うことができる。このコンピュータ・システムは必要とする目的だけに使用するように構築することも、コンピュータ・プログラムに従って動作する汎用コンピュータにすることも可能である。以下に説明する処理はどのコンピュータ・システムや他のエレクトロニック・デバイスにも適用可能である。具体的には、種々の汎用コンピューティング・マシンは以下に教示する説明に従って書かれたソフトウェアと共に使用することができるが、もっと特殊化されたエレクトロニック・デバイスを構築すると、必要とするオペレーションを実行できるので好都合である。
本発明の第4側面では、切り捨て処理手法は変換のために受信されたソース文字列が、そのソース文字列が変換のためにソース文字列を格納している入力バッファの長さを越えたときでも、異なるターゲット文字コード化に正確に変換されることを保証する。切り捨て処理手法は入力バッファに置かれているソース文字列の一部を切り捨てて、切り捨てられた部分がソース文字列内の後続文字に影響されることなくターゲット文字コード化に変換されるように作用する。当然のことであるが、入力バッファに置かれていて、切り捨てられた後のソース文字列の部分(切り捨てられた部分)を最大限にすると、コード変換を効率よく実行することができる。
本発明による切り捨て処理手法はソース文字を異なるコード化のターゲット文字に変換するコード変換システムと関連づけて以下で詳しく説明する。
図1は本発明による代表的なコンピュータ・システム100を示すブロック図である。コンピュータ・システム100は中央処理ユニット(CPU)102を装備し、このCPUは双方向にランダムアクセス・メモリ(RAM)102と、単方向にリードオンリ・メモリ(ROM)106と結合されている。代表例として、RAM104はプログラミング命令とデータを格納し、この中には現在CPU102上で実行中のプロセスに対する他のデータや命令のほかに、以下で説明するテーブルが含まれている。代表例として、ROM106はコンピュータ・システムがその機能を実行するために使用する基本的操作命令、データおよびオブジェクトを格納している。そのほかに、ハードディスク、CD ROM、磁気光学(フロプチカル)ドライブ、テープ・ドライブなどの大量記憶装置108は双方向にCPU102と結合されている。大量記憶装置108は一般的にCPUによって活発に使用されることがない追加のプログラミング命令、データおよびテキスト・オブジェクトを収容しているが、アドレス空間は例えば仮想メモリなどのためにCPUによってアクセス可能である。上述したコンピュータの各々はさらに入出力ソース110を含んでおり、その代表例として、キーボードやポインタ・デバイス(例えば、マウスやスタイラス)などの入力メディアがある。コンピュータ・システム100はデータと命令を転送できるネットワーク接続112を含むこともできる。追加の大量記憶装置(図示せず)をネットワーク接続112を経由してCPU102に接続することも可能である。コンピュータ・システム100はさらに、コンピュータ・システム100によって生成または表示されたテキストおよびイメージ(画像など)を見るための表示スクリーン114を含んでいる。
CPU102はオペレーティング・システム(図示せず)と一緒になって、コンピュータ・コードを実行するように動作する。コンピュータ・コードはRAM104、ROM106、または大量記憶装置108に置いておくことができる。また、コンピュータ・コードはポータブル・プログラム・メディア116に置いておき、必要時にコンピュータ・システム100にロードまたはインストールすることも可能である。ポータブル・プログラム・メディア116の例としては、CD−ROM、PCカード・デバイス、RAMデバイス、フロッピディスク、磁気テープなどがある。
I.定義
1.コード・ポイント:コード・ポイントとは、特定のコード化におけるビット・パターンである。通常、ビット・パターンは1または2バイト以上の長さになっている。ユニコードのコード・ポイントは常に16ビットまたは2バイトである。
2.コード化:コード化とは、文字セットとコード・ポイントのセットとを1対1で対応づけたもの(マッピング)である。例えば、ASCIIコード化はa−z、A−Z、および0−9を含むセットをコード・ポイントx00−x7Fに対応づけている。
3.テキスト要素:テキスト要素は特定のオペレーションで1つの単位として扱われる1つまたは2つ以上のコード・ポイントのシーケンスである。例えば、LATIN CAPITAL LETTER Uとその後に続くNON−SPACING DIAERESISは本発明によるコード変換オペレーションの対象となるテキスト要素である(例えば、この例では、2つの隣り合う文字)。
5.表現形態:表現形態はコンテキストに応じてその可視形体を変化させる絵文字である。ある種のコード化はコンテキストから独立している抽象文字だけをマッピングするのに対し、他のコード化は表現形体だけをマッピングする。例えば、“fi”のような合字は、LATIN CAPITAL LETTER Fとその後に続くLATIN CAPITAL LETTER Iの文字シーケンスの表現形態である。
7.デフォルト:デフォルトはターゲット・コード化内にソース・コード・ポイントに類似したものがないとき使用されるターゲット・コード化内の1つまたは2つ以上のコード・ポイントのシーケンスである。
II.ユニコード・コンバータ
本発明による一般的変換手法はソース文字を異なるコード化のターゲット文字に変換する。好ましくは、ソース文字またはターゲット文字のどちらかはユニコード文字になっている。
ユニコード標準は開発されたいくつかの文字コード化を汎用国際的文字コード化標準に統一化したものである。図2はユニコード文字コード化のフォーマットを示す図である。具体的には、ユニコード標準に用意されているコードは、図2に示すフォーマット200で示すように16ビット幅になっている。本明細書では、ユニコード文字は頭にuを付けた16進数で表され(例えば、u001)、他のコード化内の文字は頭にxを付けた16進数で表されている(例えば、x41は1バイト文字を表し、x8140は2バイト文字を表している)。
図3は、ソース文字列302を受信し、ターゲット文字列304を出力する本発明による基本的ユニコード・コード変換システム300を示すブロック図である。ユニコード・コード変換システム300はソース文字列302の文字を、ターゲット・ストリーム内にあって、文字コード化がソース文字列で使用されたコード化と異なっている1つまたは複数の文字に変換するように動作する。好ましくは、ユニコード・コード変換システム300はユニコードから異なるターゲット・コード化に変換するか(ユニコードから)、あるいは異なるソース・コードから変換する(ユニコードへ)。
図4は本発明によるユニコード・コード変換システム400の実施例を示すブロック図である。本発明の第4側面では、トランケータ407とバッファ405が存在し、適用されているが、第1、第2または第3側面では、これらは必ずしも存在する必要がないので、必ずしも適用されるとは限らない。
本発明の第1、第2および第3側面によれば、ユニコード・コード変換システム400はユニコード文字列404を受信し、ターゲット文字列406を出力するユニコードからのコンバータ402を含んでいる。ユニコードからのコンバータ402は本発明に従ってコード変換プロセスを実行する。その際に、ユニコードからのコンバータ402はスキャナ408とやりとりする。スキャナ408はスキャナ・テーブル408と一緒に使用されて、ユニコード文字列をスキャンしテキスト要素を特定する。そのあと、ユニコードからのコンバータ402はルックアップ・ハンドラ412を使用して、スキャナ408によって特定されたテキスト要素のターゲット・コード化内の1つまたは複数の文字を調べる。ルックアップ・ハンドラ412はマッピング・テーブル414を使用してテキスト要素のターゲット・コード化内の1つまたは複数の文字を取得する。さらに、ユニコードからのコンバータ402はフォールバック・ハンドラ416を使用することも可能である。フォールバック・ハンドラ416はマッピング・テーブル414と一緒に使用され、ルックアップ・ハンドラ412がテキスト要素のターゲット・コード化内の1つまたは複数の文字を特定できなかった場合に、ターゲット・コード化内にあって、テキスト要素のフォールバック・マッピングとして使用できる1つまたは複数の文字を特定するように動作する。状態管理機構(state administrator)418は変換の現在状態に関する情報を維持し、あるいはストアしている。この情報の例としては、シメトリック・スワッピングのコンテキスト、方向および状態がある。
本発明の第4側面によれば、ユニコード・コード変換システム400はユニコード文字列404を受信し、ターゲット文字列406を出力するユニコードからのコンバータ402を含んでいる。ユニコード文字列はバッファ405にストアされる。トランケータ407はバッファ405にストアされたユニコード文字列404の長さを切り捨てて、正確な変換が行われることを保証する。
ユニコードからのコンバータ402はコード変換の全体的オペレーションを制御する。その際に、ユニコードからのコンバータ402はスキャナ408とやりとりする。スキャナ408はスキャナ・テーブル408と一緒に使用されて、切り捨てられたユニコード文字列404(トランケータ407から与えられたもの)をスキャンしテキスト要素を特定する。そのあと、ユニコードからのコンバータ402はルックアップ・ハンドラ412を使用して、スキャナ408によって特定されたテキスト要素のターゲット・コード化内の1つまたは複数の文字を調べる。ルックアップ・ハンドラ412はマッピング・テーブル414を使用してテキスト要素のターゲット・コード化内の1つまたは複数の文字を取得する。さらに、ユニコードからのコンバータ402はフォールバック・ハンドラ416を使用することも可能である。フォールバック・ハンドラ416はマッピング・テーブル414と一緒に使用され、ルックアップ・ハンドラ412がテキスト要素のターゲット・コード化内の1つまたは複数の文字を特定できなかった場合に、ターゲット・コード化内にあって、テキスト要素のフォールバック・マッピングとして使用できる1つまたは複数の文字を特定するように動作する。状態管理機構(state administrator)418は変換の現在状態に関する情報を維持し、あるいはストアしている。この情報の例としては、シメトリック・スワッピングのコンテキスト、方向および状態がある。この種の情報は、切り捨てられたユニコード文字列がブロックの終わりで終わっていない非ブロック区切り変換を行うとき必要になるものである。そのような場合には、変換の現在状態に関する情報をストアしておくと、コード変換プロセスは入力文字列404がバッファ405のサイズよりも大きいときでも、正確なコード変換を行うことができる。
A.スキャナおよびスキャナ・テーブル
スキャナ408はスキャナ・テーブル410と一緒に使用されて、ユニコード文字列404をスキャンし、ルックアップ・ハンドラ412が必要とする次のテキスト要素と追加情報を戻す。追加情報には、方向情報、コンテキスト情報、および種々の状態インジケータの1つまたは2つ以上が含まれている。以下では、スキャナ408の一般的オペレーションについて説明する。スキャナ408は入力ユニコード文字列404の文字をスキャンして行く。ターゲット・コード化のために方向情報が必要であれば、テキスト要素内の各文字ごとに文字方向が取得される。また、ターゲット・コード化のために文字コンテキスト情報が必要であれば、テキスト要素内の各文字ごとに文字コンテキスト情報が取得される。そのあと、スキャナ408が文字の各々をスキャンしていくとき、スキャナ408はスキャナ・テーブル410に入っている情報に従って文字に対するアクションをとる。スキャナ408がどのようなアクションをとるかは、状態と文字クラスに基づいて判断される。スキャナ408がとることができるアクションとしては、現在の文字にマークを付けること、シメトリック・スワッピング・ビットをセットまたはクリアすること、テキスト要素のコンテキスト形式を記録すること、テキスト要素が再配列を必要とすることを示すフラグをセットすること、テキスト要素の終わりを示すこと、などがある。シメトリック・スワッピング・ビット、コンテキストおよび方向はスキャナの状態に関する情報として状態管理機構418によってセーブされる。戻す前に、スキャナ408はテキスト要素のコンテキスト情報をセーブしておく。スキャナ408はテキスト要素(入力文字列内の各テキスト要素)とその属性を返却する。属性には次のものがある。方向、クラス、優先順位、シメトリック・スワッピング状態、サブセットおよびコンテキストである。スキャナ408がテキスト要素を判断したあと、文字を標準形順序に再配列する必要が起こる場合がある。1つの例として、テキスト要素内の文字の再配列はユニコードで定義されている標準形順序になっていない非スペース・マークがテキスト要素に含まれているときに行われる。
好ましくは、スキャナ408はスキャナ・テーブル410と一緒に、並列に動作するペアのステート・マシンとして実現されている。第1ステート・マシンは文字方向を解明し、第2ステート・マシンは該当する場合には、テキスト要素と文字形式コンテキスト情報を計算し、シメトリック・スワッピング状態も記録しておく。別々になった2つのステート・マシンを使用すると、ユニコード・コード変換システム400の設計と保守が容易化される。第1および第2ステート・マシンは状態とクラスによってインデックスされる2次元配列(またはテーブル)として実現することができる。スキャナ408がとるべきアクションが文字方向によって決まる場合には、ステート・マシン・エントリは各方向についてスキャナ408がとるべき該当アクションを収めている別のテーブルまでのインデックスである。
スキャナ408の機能は入力ユニコード文字列404をテキスト要素に変換し、テキスト要素とその属性を戻すことである。スキャナ408はテキスト要素のある種の特性をセーブしておく必要があり、そうすれば、ターゲット・コード化で正しく変換されることになる。すなわち、特性には、方向、コンテキストおよびシメトリック・スワッピング状態がある。しかし、スキャナ408は、そのオペレーションが特定のターゲット・コード化から独立しているので、どのようなターゲット・コード化であるかを知っている必要はない。それにもかかわらず、ユニコード変換システム400は、テキスト要素の定義(つまり、チャンク行動)が、スキャナ・テーブル410を変更するだけでターゲット・コード化と共に変化できるように実現されていることが好ましい。
文字の方向性は文字を表示するために使用される。例えば、アラビアまたはヘブライ文字が表示スクリーンに表示されるとき、これらは右から左への順序になっている。大部分のユニコード文字は黙示的方向をもっている(ユニコード・バージョン1.0の407ページ(セクション4.6)および611ページ(付録A)を参照)。ユニコード標準に用意されている暗黙的方向クラスとその値には次のものがある。左から右へ(0)、右から左へ(1)、ヨーロッパ数字(2)、ヨーロッパ数字セパレータ(3)、ヨーロッパ数字ターミネータ(4)、アラビア数字(5)、共通数字セパレータ(6)、ブロック・セパレータ(7)、セグメント・セパレータ(8)、ホワイトスペース(9)およびその他の数字である。スキャナ408はテキスト要素の文字の方向クラスを調べる。次に、その方向クラスはテキスト要素の方向を解明するために使用される。また、方向性をオーバライドまたは埋め込ませる特殊なユニコード文字もある。これらの特殊なユニコード文字はスキャナ408によって単一文字テキスト要素として扱われる。
テキスト要素を形成するときスキャナ408が従う基本的ルールがいくつかある。ベース・ルールでは、適用されるルールがなければ、テキスト要素は単一ユニコード文字とされる。別のルールでは、ベース文字に続く非スペースまたは結合マークはそのベース文字と一緒に単一テキスト要素として分類される。さらに別のルールでは、シンボル(つまり、朝鮮ハングル・ジャモス文字)、合字または表意文字に関連する文字が見つかると、これらはテキスト要素に結合される。さらに別のルールでは、フラクション・スラッシュの両側が1つまたは複数の10進数のシーケンスで囲まれていると、これらは数字フラクション・テキスト要素として結合される。
以下では、非スペースまたは結合マークに関するルールについて詳しく説明する。ユニコード標準によれば、非スペース・マークはベース文字のあとに置かれている。従って、ベース文字のあとに置かれた非スペース文字はベース文字を含むテキスト要素の一部となる(ユニコード標準バージョン1.0、403ページ(セクション4.3)を参照)。例えば、単一の非スペース文字の後に非スペース文字でない文字が続いているときは、その非スペース文字は直前の文字と一緒にテキスト要素として結合される。その場合、テキスト要素の長さは2であり、テキスト要素の属性はベース文字によって定義されている。前に置かれた文字がなければ、非スペース文字は単一テキスト要素として渡されるだけである。複数の非スペース文字もこのようにして結合することができる。
以下では、朝鮮ハングル・ジャモス文字について詳しく説明する。各ハングル文字は暗黙値を持ち、これは次のクラスの1つになっている。Choseong(初期)、Jungseong(中間)またはJongseong(最終)である。ユニコード標準バージョン1.1(セクション5)はこれらの文字のコードと許容される組み合わせをリストしている。スキャナ408はこれらの文字の許容される組み合わせに従って朝鮮ジャモス文字をグループ化する。入力が許容されない組み合わせのときは、スキャナ408は文字を単一テキスト要素として返却する。前述したように、ハングル分節のあとに結合マークが付いているときは、その結合マークはハングル分節のテキスト要素内に挿入される。
次に、数字フラクションに関するルールについて詳しく説明する。スキャナ408は最初にフラクション・スラッシュ数字の各文字を、それらが単一文字テキスト要素であるものとして取り扱う。しかし、完全なフラクション・スラッシュ・シーケンスが見つかったときは、スキャナ408はそのシーケンスに関連する文字を単一テキスト要素になるように結合する。ディジットが結合マークと一緒に見つかったときは、そのディジットと結合マークはフラクション・スラッシュの一部となることができないが、ディジットと結合マークは一緒にテキスト要素を形成することができる。
非スペース文字を除き、すべてのアラビア文字は単一テキスト要素としてスキャナ408を通過する。アラビア形式のシェーピング状態文字も、単一テキスト要素としてスキャナを通過する。方向フォーマッティング・コードは単一テキスト要素としてスキャナ408を通過する。
B.ルックアップ・ハンドラ、マッピング・テーブルおよびフォールバック・ハンドラ
マッピング・テーブル414は1つまたは複数のユニコード文字の入力シーケンスをターゲット・コード化における1つまたは複数の出力シーケンスと突き合わせるためにルックアップ・ハンドラ412によって使用される。ユニコード・シーケンス(つまり、テキスト要素)自体のほかに、入力シーケンスに関するある種の追加情報が得られ(例えば、方向、コンテキスト、シメトリック・スワッピング状態、垂直形式要求、フォールバック要求、許容範囲、変種)、ある種のテーブルはこの情報を利用している。好ましくは、マッピング・テーブル414はフォールバック・ハンドラ416が必要とするデータもストアしているが、別のテーブルを用意してフォールバック・ハンドラ416に使用させることも可能である。
図5はユニコード・コード変換システム400のマッピング・テーブル414の好ましい配列を示す概略図である。マッピング・テーブル414は好ましくはヘッダ部分500を含み、マッピング・テーブル414のデータのセグメントはテキスト要素内の文字数に基づいて分割されている。ヘッダ部分500の内容は以下で詳しく説明する。図5に示すマッピング・テーブル414は1からN文字までのテキスト要素のコード化をサポートしている。ルックアップ・ハンドラ412が1文字テキスト要素のターゲット・コード化を探すためにマッピング・テーブル414をサーチするとき、マッピング・テーブル414のセグメント502が使用される。同様に、テキスト要素が2文字幅であれば、セグメント504が使用され、テキスト要素がN文字幅であれば、セグメント506が使用される。図4と図5は単一マッピング・テーブル414を示しているが、ユニコード・コード変換システム400は複数の異なるマッピング・テーブル414を使用する。つまり、各ターゲット文字セットごとに1つのマッピング・テーブルを使用する。各マッピング・テーブルは複数のサブテーブルを含んでいる。
マッピング・テーブル414はサイズと全体的変換速度要件を考慮に入れて設計されている。マッピング・テーブル414はルックアップ時間を重大に低下させることなく可能な限り小さくしておくべきであり、ルックアップ時間はテーブル・サイズを大幅に大きくすることなく可能な限り高速にしておくべきである。ユニコード・コード変換システム400は複数のテーブル・フォーマットをサポートしているので、各サブテーブルごとに異なるフォーマットにすることが可能である。そのようにすると、速度とサイズのトレードオフを特定のテーブルに合わせて必要時に調整することができる。好ましくは、マッピング・テーブル414の設計は単一ユニコード文字からターゲット・コード化内の単一文字にマッピングするのを可能な限り高速化するものでなければならないが、これは最も普通の使い方であるからである。
マッピング・テーブル414の設計は、テーブルがフォールバック・ハンドラ416の要求の少なくとも一部をサポートし、複数のマッピング許容範囲をサポートし、複数のターゲット文字セットの変種をサポートするようになっている。テーブル・フォーマットは1つまたは複数のユニコード文字シーケンスをゼロまたは1個以上の文字の出力シーケンスにマッピングすることもできる。マッピング・テーブル414は単一入力シーケンスに対して起こり得る複数の出力シーケンスを指定することが可能であり、特定の出力シーケンスは方向、コンテキストおよびシメトリック・スワッピング状態などの属性によって判断される。本発明の第3側面に関しては、中心となるのは出力シーケンスの1つをコンテキストに基づいて選択することである。マッピング・テーブルは容易に拡張することができるので、ユニコード・コード変換システム400のコード化の振舞を容易にカストマイズすることができる。
マッピング・テーブル414が必要とする情報には次のものがある。スキャナ408からのテキスト要素(つまり、結合マークを標準形順序にして変換される入力文字シーケンス)、垂直形式が使用可能なときに水平形式の代わりに使用するかどうか、解明されたテキスト要素の方向、テキスト要素の文字形式コンテキスト情報(初期、中間、最終、または隔離)、シメトリック・スワッピングの現在状態、どのレベルのルックアップを起動させるかの情報(許容レベル(厳格または緩和)とフォールバック(オンまたはオフ))、および特定のコード化変種の識別子である。ルックアップ・レベルに関する情報はコールまたはユニコード・コード変換システム400をコールするアプリケーション・プログラムから与えられる。方向およびコンテキストが重要でない言語または文字では、解明された方向とコンテキスト情報は必要でない。
変種の定義、ユニコード・シーケンスからターゲット・シーケンスへの実際のマッピング、およびこれらにアクセスするために使用されるテーブル・フォーマットはマッピング・テーブル414の設計によって変更可能である。従って、正確性および若干であるが、パフォーマンスとサイズとのトレードオフはマッピング・テーブル414の設計に大きく依存している。好ましいことは、マッピング・テーブル414が厳格および緩和マッピング、フォールバック・マッピング、およびデフォルト・マッピングをサポートすることである。
厳格マッピングはラウンドトリップ忠実度が保証されるコード変換である。ユニコードからターゲット文字セットへの厳格マッピングはその文字セットからユニコードへのマッピングとは逆である。ユニコードからターゲット文字セットへの緩和マッピングはターゲット文字セット内の文字の定義または隔離された用途の範囲に属する追加マッピングである。緩和マッピングは正しくマッピングされるように見えるが、若干のあいまいさがある。例えば、多くの文字セットでは、単一文字は、明示的定義、あいまいな定義、または確立された用法のいずれかによって複数の意味を持つことがある。例えば、Shift−JIS文字x8161は2つの意味を持つように規定されている。すなわち、「2重垂直線」と「平行」である。これらの意味の各々は異なるユニコード文字u2016「2重垂直線」とu2225「に平行」に対応している。Shift−JISからユニコードにマッピングするときは、コード変換システムはこれらのユニコード文字の1つ、つまり、2重垂直線を選択しなければならない。ユニコードからShift−JISにマッピングするときは、コード変換システムは両方のユニコード文字を同一Shift−JIS文字にマッピングすることができ、そのようにするのが通常である。しかし、これらのユニコードからのマッピングの1つだけはユニコードへのマッピングとは逆になっている。
厳格マッピングと緩和マッピングの比較例
・ ユニコードu000DがASCIIx0D「キャリッジリターン」に厳格にマッピングされていれば、ユニコードu2029「パラグラフ・セパレータ」はASCIIx0Dにゆるやかにマッピングすることができる。
・ ユニコードu002D「ハイフン−マイナス」がASCIIx2D「ハイフン−マイナス」に厳格にマッピングされていれば、ユニコードu2010「ハイフン」とu2212「マイナス記号」はASCIIx2Dにゆるやかにマッピングすることができる。
・ ユニコードu00EO「グラーブ付きのラテン小文字A」がISO 8859−1xEO「アクサングラーブ付きの小文字a」に厳格にマッピングされていれば、2文字のユニコード・シーケンスu0061+u0300「ラテン小文字A」+「結合アクサングラーブ」はISO 8859−1xEOにゆるやかにマッピングすることができる。
・ Shift−JISは半幅文字と全幅文字を区別しているので、Shift−JISの緩和マッピングもこれらを区別しておかなければならない。つまり、ユニコードuFF40「全幅アクサングラーブ」はShift−JISx814D「アクサングラーブ(全幅)に厳格にマッピングされており、これはShift−JISx60「アクサングラーブ(半幅)と区別されている。ユニコード・シーケンスu3000+u0300「表意文字スペース」+「結合アクサングラーブ」はShift−JISx814Dにゆるやかにマッピングすることができる。しかし、ユニコード・シーケンスu0020+u0300「スペース」+「結合アクサングラーブ」はShift−JISx814Dにゆるやかにマッピングしてはならない。これはShift−JISx60にマッピングされるべきである。
本発明の第1側面によれば、ユニコードからある種の他の文字にマッピングし再び元に戻すマッピング(ラウンドトリップ・マッピング)は、他の文字への厳格なマッピングが存在しているユニコード文字だけを使用するとき可能である。
さらに、本発明の第1から第5までの側面によれば、フォールバック・マッピングはユニコード文字の意味または同一性を保存していないユニコードからのマッピングである。つまり、これらはユニコード文字(または文字シーケンス)をその定義または用途がユニコード文字の意味または用途を含んでいないターゲット文字セット内の文字(または文字シーケンス)にマッピングする。これに対して、フォールバック・マッピングによると、ユニコード文字(または文字シーケンス)に最も近く対応しているターゲット・コード化内の文字(または文字シーケンス)が得られる。
フォールバック・マッピングの例
・ ユニコード文字u0300「結合アクサングラーブ」はフォールバック・マッピングとしてASCIIx60「アクサングラーブ[スペース])にマッピングすることができる。違いは、ユニコード文字が結合マーク(非スペース)であるのに対し、ASCII文字はスペース・マークであることである。
・ ユニコード文字u01C0「ラテン文字デンタル・クリック」はフォールバック・マッピングとしてASCIIx7C「垂直線」にマッピングすることが可能である。
・ ユニコード文字u2001「EM QUAD」はフォールバック・マッピングとしてASCIIx20「スペース」にマッピングすることが可能である。
従って、上記の例に示すように、フォールバック・マッピングはユニコード文字(またはシーケンス)にグラフィックが近似しているターゲット文字(またはシーケンス)を生成するために使用される。
パフォーマンス上の理由により(つまり、コード化をマッピング・テーブルから得るときの速度)、マッピング・テーブル414までのインデックスにはいくつかのフォーマットがある。可能とされるフォーマットには、セグメント・フォーマット、リスト・フォーマット、範囲フォーマット、チェーン・フォーマットがある。文字シーケンスの長さが異なるごとに、別々のインデックスを設けることが好ましい。その結果として、セグメント502、504、506の各々に関連するインデックスは異なるフォーマットにすることができ、各インデックスの先頭の情報はそのフォーマットを指定している。フォーマットに関係なく、各インデックスは最終的には、入力シーケンスを直接に出力シーケンスにマッピングするか、あるいは出力シーケンスが長ければ、対応する出力シーケンスのロケーションを指定しているオフセットにマッピングする。
マッピング・テーブル414までのインデックスのチェーン・フォーマットについては、以下で詳しく説明する。チェーン・フォーマットでは、セクションの先頭がチェックされ、それがチェーン・フォーマット・テーブルのチェーン・ヘッダであるか、他のフォーマットであるかが判断される。チェーン・フォーマットは複数のインデックス・テーブルのチェーンを指定し、各々は異なるフォーマットになっている場合がある。必要とするマッピングが最初のインデックス・テーブルに見つからなければ、ルックアップ・ハンドラ412は2番目のインデックス・テーブルを調べ、以下同様である。チェーン・フォーマットは、例えば、あるインデックス・フォーマット(これは空間的および/または時間的に効率的である)が入力シーケンスのすべてではないが、大部分をマッピングすることができるのに対し、別の非効率なインデックス・フォーマットは少数の残りのシーケンスを処理できるときに利用すると、便利である。チェーン・メカニズムがないと、インデックス・シーケンスのすべてに非効率のフォーマットを使用しなければならないことになる。チェーン・フォーマットは変種と許容レベルが異なるたびに、異なるサブテーブルが必要になるときにも便利である。チェーン内の各サブテーブルは、現在取り扱われているマッピング許容範囲と変種に基づいてそれを含めるか、除外させるビット・フラグをもっている。本発明の第2、第3および第4側面によれば、ルックアップ・ハンドラ412がターゲット・コード化のマッピング・テーブル414をサーチするときは、含められたサブテーブルだけが考慮される。
さらに、本発明の第1から第4までの側面によれば、各サブテーブルに関連するこれらのビット・フラグはサブテーブル・マスクを形成している。また、呼び出し側要求(例えば、コード化の変種と許容範囲)と判断された属性(例えば、解明された方向とコンテキスト)は選択マスクを形成している。サブテーブル・マスクと選択マスク内のビット割当ては同じである。従って、特定のサブテーブルを含めるかどうかの判断はサブテーブル・マスクと選択マスクのビットワイズANDをとり、そのあと結果をサブテーブル・マスクと比較することによって行われる。ビットワイズANDの結果がサブテーブルのサブテーブル・マスクと同じであれば、そのサブテーブルが含められる。そうでなければ、それは含められない。
マッピング・テーブル414のヘッダ500は好ましくは次のものを収めている。
・ 一般的識別情報−フォーマット、長さ、チェックサムおよびバージョン。
・ 最小ターゲット文字サイズ(バイト数)(文字サイズともいう)。
・ 一般的フラグ(例えば、そのルップアップ・テーブルが方向またはコンテキスト・データを必要としているかどうか)。
・ そのテーブルによって処理される最大入力シーケンス長、および1からこの最大長までの入力シーケンス長を処理するテーブルを指定しているオフセット/長さのペアのリスト。
・ そのユニコードからのマッピングのデフォルト・フォールバック文字または文字シーケンス。
・ そのテーブルによってサポートされる変種のカウントとリスト。各変種ごとに、1つまたは2つ以上の関連ビット・マスクが指定される。単一の変種に複数のビット・マスクがある場合は、属性情報(方向、コンテキスト、および垂直形式の要求)はどのビット・マスクが使用されるかを判断するために使用される。ビット・マスクで「1」にセットされたビットは異なる変種をサポートするために種々のサブテーブルをオンにするために使用される。
・ 可能とされる4つの許容範囲設定値(厳格/緩和、フォールバック・オン/オフ)の各々に関連する追加のビット・マスクのセット。該当する許容範囲レベル・マスクは変種マスクとORがとられて、サブテーブルを使用可能または使用禁止にするために使用されるビット・マスクを形成する。
C.コード変換処理
以下では、ユニコード・コード変換システム400の好適実施例によって実行される処理について詳しく説明する。
図6Aはユニコード・コード変換システム400を利用するアプリケーション(つまり、呼び出し側アプリケーション・プロセスまたはプログラム)によって実行される処理600を示すフローチャートである。具体的には、図6Aはユニコードからの処理に関係しているが、当然に理解されるように、類似のオペレーションを実行して他方の方向に変換することも可能である(ユニコードへの処理)ユニコードからのコンバータ402は全体的変換プロセスを制御する。
最初に、処理600は新しい状態インスタンスと変換のための制御情報を作成し、初期化する(602)。処理600はインスタンスを設定するので、複数のスキャン・オペレーションを進行中にし、そのインスタンスによって区別することが可能である。次に、切り捨てが必要であるかどうかの判断604が行われる。切り捨てが必要な場合には、トランケータ407が起動される(606)。切り捨てが必要になるのは、入力データ・ストリームが、変換のためのデータを収めている受入れバッファ405の容量を越えたときである。切り捨てが必要でなければ、あるいは切り捨てが必要な場合には、ブロック606に続いて、ユニコードからのコンバータ402がコールされ(608)ユニコード文字列404を変換する。ユニコードからのコンバータ402の機能は、テキスト要素を取得し、そのためのターゲット・マッピングを調べることである。これについては、以下で詳しく説明する。変換機能から戻ると、処理600はユニコードからのコンバータ402からターゲット文字列406を受け取る。
次に、処理600は変換が失敗したかどうかを判断する。変換が失敗していれば、エラーが処理される(614)。他方、変換が正常に行われていれば、変換が完了したかどうかの判断616が行われる。ユニコード文字列404の文字がターゲット・コード化に変換されたとき変換は完了する。変換が完了していれば、処理600は完了し、ターゲット文字列406はコード変換を要求したプロセスまたはアプリケーションに利用可能にされる。さらに、処理600は状態インスタンスと変換のための制御情報を破棄する(618)。他方、変換がまだ完了していないと判断616されたときは、処理600は変換が完了するか、エラーが起こるまでブロック604〜616を繰り返す。
図6Bは本発明の第4側面による切り捨て処理620を示すフローチャートである。切り捨て処理620は図6Aのブロック606で起動され、トランケータ407によって実行される。
切り捨て処理620は出力長をゼロ(0)に初期化する(622)。出力長はバッファの実効長、つまり、バッファの切り捨てられた長さに一致している。次に、次のテキスト要素が取得される(624)。次のテキスト要素の取得(624)に関連する処理はスキャナ408によって行われるが、これについては図9A〜図9Cを参照して以下で詳しく説明する。次に、テキスト要素がバッファの物理的長さ(バッファ長)を越える可能性があるかどうかの判断626が行われる。テキスト要素がバッファ長を越える可能性がなければ、出力長はそのテキスト要素を含むように更新される(628)。ここでは、実効長はテキスト要素がバッファ長を越える可能性がない限り、テキスト要素単位で大きくなる。ブロック628に続いて、考慮すべき追加テキストがバッファに残っているかどうかの判断630が行われる。考慮すべき追加テキストがバッファに残っていれば、処理はループしてブロック624に戻り、切り捨て処理620を繰り返す。他方、考慮すべき追加テキストがバッファに残っていないか、あるいはテキスト要素がバッファ長を越える可能性があるとブロック626で判断されていれば、出力長が戻される(632)。戻された出力長(632)はバッファの実効長(つまり切り捨てられた長さ)であるので、バッファは実効的にテキスト要素の終わり(つまり、バッファ内のテキストの最後のテキスト要素)で終了する。
以上のようにして、切り捨て処理はバッファの実効長(つまり、切り捨てられた長さ)を判断する。これはバッファの切り捨てられた部分とも呼ばれる。切り捨ての後バッファに残っている余分のテキストは残余部分と呼ばれる。残余部分は入力ソース文字列の次のバッファ部分にキャリーオーバされ、その部分と一緒に考慮される。この処理はテキスト要素が正しく判断されることを保証する。
以下は切り捨て処理の使い方の例である。
例:“...ABCD`EFG...”
バッファに置かれている部分が“D”の直後で終わっていれば、切り捨て
処理はバッファに置かれている部分を切り捨てて、切り捨てられた長さが
“C”のあとで終わるようにする。バッファに置かれた部分を切り捨てる
必要があるのは、そのようにしないと、テキスト要素“D”がそのあとに
置かれた結合マーク“`”から切り離されることになるからである。切り
離されると、テキストはターゲット・コード化に正しく変換されないこと
になる。残余部分は“D`”であり、次の部分にキャリーオーバされ、
“D`EFG..”となる。
図7はユニコード・コンバータ処理700を示すフローチャートである。ユニコード・コンバータ処理700は図6Aのブロック608で実行されるオペレーションと関連づけられている。
ユニコード・コンバータ処理700は判断702から始まる。この判断702は変換すべきテキストがあるかどうかを判断する。変換すべきテキストがなければ、ユニコード・コンバータ処理700は戻るだけである(または完了する)。他方、変換すべきテキストがあれば(つまり、ユニコード文字列404が完全に処理されていなければ)、処理700が続けられる。まず、オフセットがオフセット配列に対して更新される(704)。オフセット配列入力文字列に関連するオフセット(ポインタ)の配列であり、フォント変更、ライン中断、言語変更などのある種の変更が、呼び出し側アプリケーションが有意と判断している入力文字列404内のどこで行われたかを示している。オフセット配列の更新704は、異なる文字長に合わせてオフセット(ポインタ)を調節することにより行われる。例えば、入力ユニコード文字列404のユニコード文字は2バイト長であるのに対し、ASCIIのターゲット・コード化に関連する文字のサイズは1バイト長である。ここでは、オフセット配列の更新704はオフセットがターゲット・コード化内の対応する文字を指すようにオフセットを更新する。実際には、入力文字列内のオフセットはコード化が異なっている出力文字列にマッピングされる。次に、次のテキスト要素が取得される(706)。スキャナ・テーブル410を用いるスキャナ408はユニコード文字列404からのテキスト要素を判断する。次のテキスト要素の取得706は以下で詳しく説明する。次に、取得されたテキスト要素はマッピング・テーブル414で調べられ(708)、ターゲット・コード化内のテキスト要素の変換コードが得られる。このルックアップはマッピング・テーブル414を使用してルックアップ・ハンドラ412によって行われる。変換コートのルックアップ708についても以下で詳しく説明する。
次に、テキスト要素の変換コードが見つかったかどうかの判断710が行われる。変換コードが見つかったときは、ユニコード文字列404とターゲット文字列406の入力位置ポインタと出力位置ポインタがそれぞれ更新される(712)。入力位置ポインタは入力文字列404がどれだけ変換されたかを示している。出力位置ポインタはターゲット文字列406の長さを示している。ブロック712に続いて、処理700はユニコード・コンバータ処理700の先頭に戻り、変換すべきユニコード文字列404の次のテキスト要素(存在する場合)が処理できるようにする。
しかるに、変換コードがマッピング・テーブル414に見つからないと判断710が判断したときは、呼び出し側(例えば、呼び出し側アプリケーション)がフォールバック処理を要求していたかどうかの判断714が行われる。呼び出し側がフォールバック処理を要求していれば、フォールバック処理が実行される(716)。フォールバック処理はフォールバック・ハンドラ416によって実行される。これは以下で詳しく説明する。他方、呼び出し側がフォールバック処理を要求していなければ、テキスト要素がルックアップ・ハンドラ412によってターゲット・コード化に変換できなかったのでエラーが通知される(718)。ブロック716と718に続いて、ユニコード文字列404とターゲット文字列406の入力位置ポインタと出力位置ポインタがそれぞれ更新され(702)、そのあと処理はユニコード・コンバータ処理700の先頭に戻り、変換すべきユニコード文字列4040の次のテキスト要素(存在する場合)が処理できるようにする。
図8はオフセット更新処理800を示すフローチャートである。オフセット更新処理800はオフセット配列が更新される図7のブロック704と関連している。
オフセット更新処理800は現在入力位置がオフセット配列にあるかどうかを判断802することから始まる。現在入力位置がオフセット配列にあれば、オフセット配列の内容がブロック804に続いて現在出力位置長さに従って更新される(804)、オフセット更新処理800から戻る。他方、現在入力位置がオフセット配列にないときは、更新すべきオフセットがないのでオフセット更新処理800から戻る判断802が行われるだけである。
図9Aおよび図9Bは本発明の第1、第2および第4側面による次のテキスト要素処理900を示すフローチャートである。次のテキスト要素処理900は次のテキスト要素を取得するとき図7のブロック706で実行されるオペレーションを具体化したものである。好ましくは、次のテキスト要素処理900はスキャナ・テーブル410を使用してスキャナ408によって行われる。
次のテキスト要素処理900は状態と再配列フラグを初期化(902)することから始まる。次に、マッピング・テーブル414が方向情報を必要としているかどうかの判断904が行われる。マッピング・テーブル414が方向情報を必要としていれば、ユニコード文字列404の方向が解明される(906)。本発明の第2側面では、マッピング・テーブル414が方向情報を必要としていれば、ユニコード文字列404の次の入力文字の方向が解明される(906)。方向が解明されると(906)、あるいは方向が必要でない場合には判断904の後で、文字のコンテキストに基づく判断908が行われる。ユニコード文字列404内の文字のコンテキストがコード変換(マッピング)に影響する可能性があるときは、コンテキストが解明される(910)。ブロック910に続いてまたは判断908に続いて、コンテキストが重要でないときは、ユニコード文字がユニコード文字列404から取得される(912)。ここでは、ユニコード文字列404内の次の文字が取得される。次に、取得されたユニコード文字の属性が調べられる(914)。属性ルックアップ914は図11〜図13を参照して以下で詳しく説明する。次に、次のテキスト要素処理900のアクションが判断される(916)。アクションの判断916は図14A、図14Bおよび図15を参照して以下で詳しく説明する。
次に、アクションが“END”であるかどうかの判断918が行われる。アクションが“END”でなければ、アクションは少なくとも“ADVANCE”である。アクションが“ADVANCE”であるときは、アクションが“MARK”でもあるかどうかの判断920が行われる。アクションが“MARK”でもあるときは、文字がテキスト要素に挿入される(922)。さらに、“MARK”アクションがとられると双方向状態がセーブされる(924)。双方向状態は方向性埋め込みスタックと双方向ステート・マシンの現在状態を含んでいる。ブロック924に続いてまたはアクションが“MARK”でもないときは判断ブロック920に続いて、アクション修飾子に基づいてスイッチ・オペレーションが実行される。アクション修飾子はアクションの一部であり、“S”、“ISS”、“ASS”などの修飾子を含んでいる。アクションはどのアクション修飾子ももたないこともできる。アクション修飾子が“S”であるときは、再配列フラグがセットされる(928)。再配列フラグ(セットされたときは)はテキスト要素内の文字を再配列する必要がないことを示している。アクション修飾子が“ISS”(つまり、シメトリック・スワッピング禁止)であるときは、スワップ・フラグがオフにセットされる(930)。アクション修飾子が“ASS”(つまり、スワッピング禁止活動化)であるときは、スワップ・フラグがオンにセットされる(932)。スワップ・フラグはシメトリック・スワッピングが必要かどうかを示している。スイッチ926は拡張エリア934を使用して追加のアクション修飾子を含むように容易に適応させることができる。拡張エリア934を使用すると、ユーザはスキャナ408の振舞を変更することができる。また、アクション修飾子がなければ、次のテキスト要素処理900はアクション修飾子に関連するどのオペレーションも実行しない。アクション修飾子オペレーションに続いて、現在文字インデックスが更新される(936)。現在文字インデックスは次のテキスト要素処理900を実行するときソース文字列をスキャンしていくために使用されるソース文字列を指すポインタである。次に、次のテキスト要素処理900はブロック904から始まるオペレーションを繰り返す。処理はアクションが“END”であると判断918が判断するまでループしてブロック904−936を繰り返す。アクションが“END”であると、判断918は判断ブロック938を実行させる。判断ブロック938は再配列フラグがセットされているかどうかを判断する。再配列フラグがセットされていれば(ブロック928)、テキスト要素内の文字は再配列される(940)。再配列は異種の文字クラスの加重値を提供する優先順位属性を使用して行うことが好ましい。再配列フラグがセットされていない場合にはブロック938に続いて、再配列フラグがセットされている場合にはブロック940に続いて、次のテキスト要素処理900は完了し、ユニコード・コンバータ処理700に戻る。
図10A、図10Bおよび図10Cは本発明の第3側面による次のテキスト要素処理900を示すフローチャートである。次のテキスト要素処理900は次のテキスト要素を取得するとき図7のブロック706によって実行されるオペレーションを具体化したものである。好ましくは、次のテキスト要素処理900はスキャナ・テーブル410を使用してスキャナ408によって実行される。
次のテキスト要素処理900は状態と再配列フラグを初期化(952)することから始まる。次に、マッピング・テーブル414が方向情報を必要としているかどうかの判断954が行われる。マッピング・テーブル414が方向情報を必要としていれば、ユニコード文字列404の次の入力文字の方向が解明される(956)。次に、ユニコード文字がユニコード文字列414から取得される(958)。ここでは、ユニコード文字列404内の次の文字が取得される(958)。次に、取得されたユニコード文字の属性が調べられる(960)。属性ルックアップ960は図11〜図13を参照して以下で詳しく説明する。次に、次のテキスト要素処理900のアクションと次の状態が判断される(962)。アクションと次の状態の判断は図14A、図14B、図16Aおよび図16Bを参照して以下で詳しく説明する。
次に、アクションが“END”であるかどうかの判断964が行われる。アクションが“END”でなければ、アクションは少なくとも“ADVANCE”である。アクションが“ADVANCE”であるときは、アクションが“MARK”でもあるかどうかの判断966が行われる。アクションが“MARK”でもあるときは、文字がテキスト要素に挿入される(968)。さらに、“MARK”アクションがとられると双方向状態がセーブされる(970)。双方向状態は方向性埋め込みスタックと双方向ステート・マシンの現在状態を含んでいる。ブロック970に続いてまたはアクションが“MARK”でもないときは判断ブロック966に続いて、アクション修飾子に基づいてスイッチ・オペレーション972が実行される。アクション修飾子はアクションの一部であり、“S”、“ISS”、“ASS”などの修飾子を含んでいる。アクションはどのアクション修飾子ももたないこともできる。アクション修飾子が“S”であるときは、再配列フラグがセットされる(974)。再配列フラグ(セットされたときは)はテキスト要素内の文字を再配列する必要がないことを示している。アクション修飾子が”ISS”(つまり、シメトリック・スワッピング禁止)であるときは、スワップ・フラグがオフにセットされる(976)。アクション修飾子が”ASS”(つまり、スワッピング禁止活動化)であるときは、スワップ・フラグがオンにセットされる(980)。スワップ・フラグはシメトリック・スワッピングが必要かどうかを示している。スイッチ972は拡張エリア980を使用して追加のアクション修飾子を含むように容易に適応させることができる。拡張エリア980を使用すると、ユーザはスキャナ408の振舞を変更することができる。また、アクション修飾子がなければ、次のテキスト要素処理900はアクション修飾子に関連するどのオペレーションも実行しない。アクション修飾子オペレーションに続いて、現在文字インデックスが更新される(982)。現在文字インデックスは次のテキスト要素処理900を実行するときソース文字列をスキャンしていくために使用されるソース文字列を指すポインタである。次に、次のテキスト要素処理900はブロック954から始まるオペレーションを繰り替えす。処理はアクションが“END”であると判断964が判断するまでループしてブロック954〜982を繰り返す。アクションが“END”であると、判断964はコンテキスト処理984を実行させる。コンテキスト処理984のあと、判断ブロック986は再配列フラグがセットされているかどうかを判断する。再配列フラグがセットされていれば(ブロック974を参照)、テキスト要素内の文字は再配列される(988)。再配列は異種の文字クラスの加重値を提供する優先順位属性を使用して行うことが好ましい。再配列フラグがセットされていない場合にはブロック986に続いて、再配列フラグがセットされている場合にはブロック988に続いて、次のテキスト要素処理900は完了し、ユニコード・コンバータ処理700に戻る。
次に、図10Cを参照してコンテキスト処理984について説明する。コンテキスト処理984はここで説明している実施例では、スキャナ・テーブル410を使用するスキャナ408によって実現されている。コンテキスト処理984は判断985から始まり、アクションがEndOutputXn(つまり、単独コンテキスト)であるかどうかが判断される。そうであれば、コンテキスト・マスクがセットされ(986)、コンテキストが単独であることを示し、コンテキスト処理984は完了し、戻る。他方、アクションがEndOutputXnでなければ、アクションがEndOutputX1(つまり、初期コンテキスト)であるかどうかが判断987で判断される。そうであれば、コンテキスト・マスクがセットされ(988)、コンテキストが初期であることを示し、コンテキスト処理984は完了し、戻る。他方、アクションがEndOutputX1でなければ、アクションがEndOutputXr(つまり、終了コンテキスト)であるかどうかが判断989される。そうであれば、コンテキスト・マスクがセットされ(990)、コンテキストが初期であることを示し、コンテキスト処理984は完了し、戻る。他方、アクションがEndOutputXrでなければ、アクションがendOutputXm(つまり、中間コンテキスト)であるかどうかの判断991が行われる。そうであれば、コンテキスト・マスクがセットされ(992)、コンテキストが初期であることを示し、コンテキスト処理984は完了し、戻る。アクションがEndOutputXmでないと判断991されたときは、テキスト要素は関連するコンテキストをもっていないので、コンテキスト・マスクは「無視」にセットされる(993)。
以上のように、コンテキスト処理984は上記実施例では、テキスト要素とコンテキストが一緒に判断されるように実現されている。どちらの判断も、スキャナ408とスキャナ・テーブル410によって先読みスキャンニングを利用してテキスト要素が完成し、入力テキスト・ストリーム内のテキスト要素の内容が分かるようにしている。コンテキスト・マスクに入っているコンテキスト情報は、マッピング・テーブル414とやりとりして、判断されたコンテキストをもつテキスト要素の正しいターゲット・コード化を探すときにルックアップ・ハンドラ412によって使用される。コンテキスト処理のオペレーションの詳細は図16Aと図16Bを参照して以下で説明する。
図11はスキャナ408を示すブロック図である。特に、スキャナ408は属性ハンドラ1000とテキスト要素ハンドラ1002を含んでいる。テキスト要素ハンドラ1002は図9Aと図9Bおよび図10A〜図10Cを参照して上述した次のテキスト要素処理900を実行する。属性ハンドラ1000は属性テーブル1004とやりとりして、次のテキスト要素処理900が必要とするユニコード文字の属性を取得する(図9Aのブロック914と図10Aのブロック960を参照)。属性には次のものがある。つまり、方向、クラス、優先順位、シメトリック・スワッピング、サブセットおよびコンテキストである。方向属性は方向を解明するとき使用される(図9Aのブロック914および図10Aと図17Aのブロック956を参照。クラス属性はアクション(例えば、ADVANCE、END)を判断するためにスキャナ408によって使用される。優先順位属性はテキスト要素内の文字を記録するために使用される(図9Bのブロック940と図10Aのブロック988を参照)。シメトリック・スワッピング属性はシメトリック・スワッピングが必要であるかどうかを判断するために使用される。コンテキスト属性はコンテキストを解明するときに使用される(図9Aのブロック910を参照)。
図12は図11の属性テーブル1004の好ましいフォーマットを示す概略図である。属性テーブル1004はヘッダ部分1100、範囲テーブル部分1102、および属性テーブル部分1104を含んでいる。ヘッダ部分1100は次のものに関する情報を含んでいる。つまり、各テーブルの総テーブル・サイズ、チェックサム値、バージョン、オフセットおよび要素の数である。範囲テーブル部分1102内の要素は属性が共通にグループ化されている範囲を示し、各グループごとに、属性テーブル部分1104の該当部分を指すポインタをもっている。属性テーブル1004の範囲テーブル部分1102のフォーマットは、例えば、各エントリごとに、範囲値の開始、範囲値の終了、および範囲に関連するデータ・ワードを含んでいる。属性テーブル1004の構成は属性情報のコンパクトなストアを容易にしている。別のストア構成も可能であるが、データ・ストアのコンパクトさから見たとき非効率的である。
図13は属性ルップアップ処理1200を示すフローチャートである。属性ルックアップ処理1200は属性ハンドラ1000によって実行され、図9Aのブロック914または図10Aのブロック960で次のテキスト要素処理900によって開始される。
属性ルックアップ処理1200は属性テーブル1004の範囲テーブル部分1102内の範囲を使用してバイナリ・サーチから開始される。該当の範囲がバイナリ・サーチで見つかると、その範囲に関連するデータ・ワードが範囲テーブル部分1102から取得される(1204)。好ましくは、データ・ワードの最初のビットは間接ビットである。次に、データ・ワードの間接ビットがセットされているかどうかの判断1206が行われる。データ・ワードの間接ビットがセットされていない場合は、データ・ワード自体は現在の文字の属性を収めているので、データ・ワードは属性として戻される(1208)。他方、データ・ワードの間接ビットがセットされていれば、属性は、範囲テーブル部分1102から取得されたデータ・ワードを属性テーブル部分1104までのインデックスまたはオフセットとして使用して属性テーブル部分1104から取得される。従って、この場合のデータ・ワードは範囲内の各文字の属性を収めている配列までのインデックスまたはオフセットである。ブロック1208または1210に続いて、属性ルックアップ処理1200は完了し、戻る。
図14Aと図14Bは次のアクションを判断するためにスキャナ408によって使用されるスキャナ・テーブル1300(410)に関連する概略図である。次のアクションの判断は次のテキスト要素処理900(図9A)のブロック916によって起動されるか、ブロック962(図10A)によって起動される。図14Aは本発明で使用されるスキャナ・テーブル1300の好ましいフォーマットを示す図である。スキャナ・テーブル1300は「現在状態」を1つのインデックスとして、「クラス」を別のインデックスとしてもつ2次元配列である。「クラス」はクラス属性を指している。これらのインデックスはスキャナ・テーブル1300内の代表的な要素1302を選択する。図14Bはスキャナ・テーブル1300の代用的な要素1302を示す図である。代表的な要素1302はスキャナ408の次の状態を収めている次の状態部分1304を含み、アクション部分1306はスキャナ408のアクションを示している。実際には、スキャナ408はスキャナ・テーブル1300と一緒になって、スキャナをどのように動作させるかを判断するステート・マシンを実現している。
スキャナ・テーブル1300は異種の文字コード化に関する異なる次の状態とアクションを収めている。
本発明の第1、第2および第4側面によれば、図15は好ましいレイアウトとスキャナ・テーブル1300にストアされる情報の両方を示しているテーブル1400である。このテーブルに関連する表記は次の通りである。
文字クラス:
CC −制御文字
OS −他のスペース
NS −非スペース
LD −ラテン・ディジット
FS −フラクション・スラッシュ
JL(f)−ジャモス先頭子音(フィラー)
JV(f)−ジャモス母音(フィラー)
JT −ジャモス・トレーラ
NU −有効なユニコード文字でない
ISS −シメトリック・スワッピング禁止
ASS −シメトリック・スワッピング活動化
次の状態:
状態0 −終了。テキスト要素を戻すべきかどうかを、2重および半分音符号の状態に基づいて判断する。
状態1 −開始状態
状態2 −非スペース(分音符号)の追加
状態3 −数値フラクションの有無チェック
状態7 −朝鮮語ジャモス
アクション:
Adv −[ADVANCE]次の文字へ進む(現在文字は現在テ
キスト要素(TE)に含まれている場合と含まれていな
い場合がある)
AdvMark −[ADVANCE+MARK]現在文字に最終文字の
マークを付け次の文字へ進む
AdvMarkS −[ADVANCE+MARK+S]現在文字に最終文字
のマークを付け次の文字へ進み、再配列フラグをセット
する
AdvMarkASS −[ADVANCE+MARK+ASS]現在文字に
最終文字のマークを付け次の文字へ進み、シメトリック・
マッピングを活動化する
AdvMarkISS −[ADVANCE+MARK+ISS]現在文字に
最終文字のマークを付け次の文字へ進み、シメトリック・
マッピングを禁止する
End −テキスト要素を最終のマークを付けた文字で終了する
注意:すべての機能は再配列フラグがセットされているかをチェックして確かめ、非スペース文字を開始ポインタから始めて再配列する。再配列する必要のある非スペース・マークのセットは複数存在することがあるので、文字列全体をチェックするのが最良の方法である。もちろん、文字を再配列すると、再配列フラグはクリアされる。
本発明の第3側面によれば、図16Aおよび図16Bは好ましいレイアウトと情報の両方を示すテーブル1400であり、情報はソース文字列内のテキスト要素とそのコンテキストの両方の判断を容易にするためにスキャナ・テーブル410にストアされるものである。このテーブルに関連する表記は次のとおりである。
文字クラス:
CC −制御文字
OS −他のスペース
NS −非スペース
LD −ラテン・ディジット
FS −フラクション・スラッシュ
DD −二重分音符号
HD −半分音符号
CH −ジャモス先頭子音(フィラー)
JO −ジャモス母音(フィラー)
JV −ジャモス子音トレーラ
NU −有効なユニコード文字でない
ISS −シメトリック・マッピング禁止
ASS −シメトリック・マッピング活動化
HH −高ハーフゾーン
LH −低ハーフゾーン
V −Virama
ZWNJ −ゼロ幅の非ジョインダ
R −右リンク
D −2重リンク
C −リンクを引き起こす
T −透過
次の状態:
状態0 −終了。テキスト要素を戻すべきかどうかを2重分音符号と半分音符号に基づいて判断する
状態1 −開始状態
状態2 −非スペース(分音符号)追加
状態3 −ラテン・ディジット
状態4 −ラテン・ディジット・シーケンス
状態5 −ラテン・ディジット・シーケンスとそのあとに続くフラクション・スラッシュ
状態6 −ラテン・ディジット・シーケンス、フラクション・スラッシュ、ラテン・ディジット・シーケンス
状態7 −Choseongシーケンス
状態8 −Choseongシーケンスとそのあとに続く
Jungseongシーケンス
状態9 −Choseongシーケンス、Jungseongシーケンス、Jongseong
状態10 −高半文字
状態11 −高半文字とそのあとに続く低半文字
状態12 −Viramaとそのあとに続くゼロ幅ジョインダまたはゼロ幅非ジョインダ
状態13 −コンテキストの特殊開始
状態14 −右リンク文字(特殊コンテキスト状態)
状態15 −2重リンク文字(特殊コンテキスト状態)
状態16 −リンクを引き起こす文字(通常または特殊状態)
状態17 −右リンク文字(通常状態)
状態18 −2重リンク文字(通常状態)
次の開始状態:[実際は次の状態のサブセット]
開始1 −開始状態
開始13 −コンテキストの特殊開始状態
アクション:
Adv −[ADVANCE]次の文字へ進む(現在文字は現在テ
キスト要素(TE)に含まれている場合と含まれていな
い場合がある)
AdvMark −[ADVANCE+MARK]現在文字に最終文字の
マークを付け次の文字へ進む
AdvMarkS −[ADVANCE+MARK+S]現在文字に最終文字
のマークを付け次の文字へ進み、再配列フラグをセット
する
AdvMarkASS −[ADVANCE+MARK+ASS]現在文字に
最終文字のマークを付け次の文字へ進み、シメトリック・
マッピングを活動化する
AdvMarkISS −[ADVANCE+MARK+ISS]現在文字に
最終文字のマークを付け次の文字へ進み、シメトリック・
マッピングを禁止する
End −テキスト要素を最終のマークを付けた文字で終了する
EndOutputXn −[END+単独コンテキスト]テキスト要素を終
了し、単独コンテキストであることを示す
EndOutputX1 −[END+初期コンテキスト]テキスト要素を終
了し、初期コンテキストであることを示す
EndOutputXr −[END+終了コンテキスト]テキスト要素を終
了し、終了コンテキストであることを示す
EndOutputXm −[END+中間コンテキスト]テキスト要素を終
了し、中間コンテキストであることを示す
注意:すべての機能は再配列フラグがセットされているかをチェックして確かめ、非スペース文字を開始ポインタから始めて再配列する。再配列する必要のある非スペース・マークのセットは複数存在することがあるので、文字列全体をチェックするのが最良の方法である。もちろん、文字を再配列すると、再配列フラグはクリアされる。
以下では、スキャナ・テーブル1400の使用例を3つ示して説明する。最初の2つの例は本発明の第1、第2、第3および第4側面に関係し、最後の例は第3側面に関係するものである。
例1:入力文字列“AAB”
文字クラスは3文字ともOSである。最初の文字“A”が取得される。開始状態(状態1)から始まり、最初のアクションはAdvMark、次の状態は状態2である。これにより、最初の文字“A”が現在テキスト要素内に挿入され、次の文字(2番目の文字“A”)が取得される。次に、状態2では、アクションはEnd、次の状態は状態0である。従って、テキスト要素は最初のテキスト要素だけを含んでいる。同じシーケンスはこの特定入力文字列の2番目と3番目の文字について繰り返される。このようにして、入力文字列の文字の各々は分離しているが、隣接しているテキスト要素に割り当てられる。
例2:入力文字列“A`B”
文字クラスは入力文字列の最初と最後の文字ではOSである。2番目の文字の文字クラスがNSであるのは、これが結合マークであるためである。最初の文字“A”が取得される。開始状態(状態1)から始まり、最初のアクションはAdvMark、次の状態は状態2である。これにより、最初の文字“A”が現在テキスト要素内に挿入され、次の文字(2番目の文字“`”)が取得される。次に、状態2では、アクションはAdvMarkS、次の状態は状態2である。これにより、2番目の文字“`”が現在テキスト要素に挿入される。次に、3番目の文字が取得される。この時点の状態2のアクションはEnd、次の状態は状態0である。従って、テキスト要素は入力文字列の1番目と2番目の文字を含んでいる。3番目の文字は例1の場合と同じように、自身のテキスト要素に置かれる。
例3:入力文字列“OS R D OS OS”[文字間にスペースがなく、各文字はその文字クラスで表されている。RとD文字クラスはコンテキスト・ベースの表示形態をもつ文字を含んでいるが、OS文字クラスは含んでいない。]
最初の文字は文字クラスOSである。開始状態(状態1)から始まり、最初のアクションはAdvMark、次の状態は2、次の開始状態は1である。これにより、最初の文字が現在テキスト要素に挿入され、2番目の文字が取得される。2番目の文字は文字クラスRである。次に、状態2では、アクションはEnd、次の状態は0、次の開始状態は1である。従って、最初のテキスト要素は最初の文字だけを含み、コンテキスト・フラグは無視にセットされる。
次のテキスト要素を判断するときは、処理は2番目の文字から始まり、新しい開始状態は1になっている。この時点で、スキャナ・テーブルから得られるアクションはAdvMarkであり、次の状態は17、次の開始状態は13である。これにより、2番目の文字が現在テキスト要素に挿入され、3番目の文字が取得される。3番目の文字は文字クラスRである。次に、状態17では、アクションはEndOutputXn、次の状態は0、次の開始状態は1である。従って、2番目のテキスト要素は2番目の文字だけを含み、コンテキストはXn(単独)である。
次のテキスト要素を判断するときは、処理は3番目の文字から始まり、新しい開始状態は13になっている。この新しい開始状態は最後の文字についてテーブルで示された次の開始状態である。ここでは、スキャナ・テーブルから得られるアクションはAdvMarkであり、次の状態は15、次の開始状態は13である。3番目の文字は現在テキスト要素の一部であるので、4番目の文字が取得される。4番目の文字は文字クラスOSである。次に、状態15では、アクションはEndOutputXr、次の状態は0、次の開始状態は1である。従って、3番目のテキスト要素は3番目の文字だけを含み、コンテキストはXr(終了)である。
次のテキスト要素を判断するときは、処理は4番目の文字から始まり、新しい開始状態は13になっている。スキャナ・テーブルから得られるアクションはAdvMarkであり、次の状態は2、次の開始状態は1である。これにより、4番目の文字が現在テキスト要素に挿入され、5番目の文字が取得される。5番目の文字は文字クラスOSである。次に、状態2では、アクションはEnd、次の状態は0、次の開始状態は1である。従って、4番目のテキスト要素は4番目の文字だけを含み、コンテキスト・フラグは無視にセットされる。
図17Aは本発明の第2側面による方向解明処理1500を示すフローチャートである。方向解明処理1500は次のテキスト要素処理900(図9A)内のブロック906で実行される処理である。方向解明処理1500は、スキャナ408のために解明された方向の状態が初期状態にあるかどうかを判断する判断1502から開始される。初期状態では、スキャナ408はテキスト要素内の文字の方向を知らない。スキャナ408のために解明された方向の状態が初期状態にあれば、入力文字列の初期方向が判断される(1504)。初期状態1504の判断1504に関連する処理は図18を参照して以下で詳しく説明する。他方、スキャナ408のために解明された方向の状態が初期状態にないときは、初期方向を判断する必要はない。どちらの場合も、ブロック1502またはブロック1504に続いて、ユニコード文字が入力ストリームから取得される(1506)。次に、ユニコード文字に関連する属性が調べられる(1508)。方向属性は方向解明処理1500を行うとき重要な属性である。方向解明処理1500のブロック1506と1508が実行するオペレーションは次のテキスト要素処理900のブロック912と914のそれと同じであるので、これ以上詳しく説明することは省略する。
次に、方向、次の状態およびアクションが判断される(1510)。方向、次の状態およびアクションは方向属性と現在状態を使用して判断され、テーブル属性ルップアップ・プロセスを使用して方向テーブルから取得される。方向テーブルは方向属性と現在状態によってインデックスされる2次元配列である。インデックスが指している方向テーブル内の要素は文字の方向、次の状態、および方向解明処理1500がとるべきアクションを含んでいる。方向は次のものの1つである。すなわち、左、右、グローバル、およびNO_OUTPUTである。取り得るアクションは、NO_ACTION、PUSH RO、PUSH RE、PUSH LE、PUSH LO、POP、およびRESETである。方向は明示的オーバライド文字により入力文字列の中で変化することがあるので、以前の方向は方向スタック上にストアされている。従って、「プッシュ」および「ポップ」の使用はこの分野で周知であるスタック操作コマンドを意味する。“RO”は右から左へのオーバライドを意味し、“LO”は左から右へのオーバライドを意味し、“RE”は右から左への埋め込みを意味し、“LE”は左から右への埋め込みを意味する。好ましくは、方向テーブルと方向解明処理1500はステート・マシンとして動作する。ステート・マシンは基本的にユニコード標準バージョン1.0 611−621ページ(付録A)に記載されている双方向アルゴリズムに従って動作するが、1回のパスだけで結果が得られるのに対し、ユニコード標準に記載されているアルゴリズムは複数のパスを必要とする。
図17B〜図17Dは本発明の第2側面による双方向アルゴリズムの好ましいインプリメンテーションによる双方向状態テーブル1511を示している。双方向状態テーブル1511はテーブル駆動型ステート・マシンを実現している。各カラムは単一状態である。状態はそこに記録される情報を示唆する名前が付けられている。各行は図17B〜図17Dにまたがっており、以下に示す文字クラス名の1つが付けられている。
LR 左から右へが主流
RL 右から左へが主流
AL アラビア文字(右から左へが主流)
LRE 左から右への埋め込みマーク
RLE 右から左への埋め込みマーク
LRO 左から右へのオーバライド・マーク
RLO 右から左へのオーバライド・マーク
PDF ポップ方向フォーマット・マーク
AN アラビア数字
EN ヨーロッパ数字
ET ヨーロッパ数字ターミネータ
ES ヨーロッパ数字セパレータ
CS 共通数字セパレータ
ON その他の中立文字
BS ブロック・セパレータ
双方向状態テーブル1511の各セルは関連のアクションと出力を持つ遷移を表している。これらのセルは新しい状態の名前、とられるオプションのアクション、および出力(もしあれば)を収めている。新しい状態は現在のグローバル方向に左右される場合がある。これは新しい状態名に(G)を入れることで示される。グローバル方向が未知のときこれらの遷移の1つを行うとエラーになる。取り得るアクションは次のとおりである。
プッシュ 新しい埋め込み状態を埋め込みスタック上にプッシュする。プッ
シュされる実際の値は現れた実際の埋め込み制御によって決ま
る。このインプリメンテーションでは、これを処理するアクショ
ン動詞は4つある。
ポップ 現在の埋め込み状態をスタックからポップし、スタックの新しい
トップを現在の埋め込み状態にする。新しい埋め込みがオーバラ
イドであれば、セルに入っているターゲット状態にではなくOR
状態に遷移が行われる。
リセット 埋め込み状態をクリアし、文字を消費することなくSTARTに
移る。すなわち、エプシロン遷移を行う。リセットには出力はな
い。
エラー 即時エラーを引き起こす。
出力はそれぞれ左から右へと右から左へを意味するLまたはRのどちらか、現在のグローバル方法の出力を意味するG、または出力なしを意味する*である。マシンには、小文字の‘s’で始まらない名前を持つ状態で入ることができる。START状態は新しいテキスト・ブロックを目的としている。sDIR状態はグローバル方向を判断するときのエントリ・ポイントとして使用される。この計算はメイン・スキャンと同時に行うことが可能であるが、別々にすると単純化される。
図15Aに戻って説明すると、ブロック1510に続いて、アクションが“RESET”であるかどうかの判断1512が行われる。アクションが“RESET”であれば、処理は方向解明処理1500の先頭に戻る。そうでなければ、方向解明処理1500が続行される。つまり、判断1512に続いて、アクションが実行される(1514)。
次に、方向(ブロック1510で判断されたもの)が“NO_OUTPUT”であるかどうかの判断1516が行われる。方向が“NO_OUTPUT”に等しくなければ、方向がコンテキスト(各インスタンスごとに)にセットされ(1518)、状態が保存される(1520)。ブロック1520に続いて、方向解明処理1500は完了し、戻る。
しかるに、出力が“NO_OUTPUT”であると判断1516で判断されたときは、入力文字列全体が処理されたかどうかの判断1522が行われる。入力文字列全体が処理されていなければ、処理は方向解明処理1500の先頭に戻り追加のユニコード文字を取得し、処理できるようにするが、これはテキスト要素の方向がまだ判断されていないためである。他方、入力文字列全体が処理されたと判断1522されたときは、処理がテキストの終わりまで達したかどうかが判断1524される。つまり、ターゲット・コード化に変換すべきテキストが方向解明処理1500によって完全に処理されたかどうかが判断される。変換すべき追加テキストがあれば、入力文字列の現在の文字では方向が計算できなかったのでエラーになる(1528)。しかし、追加テキストがなければ、ブロック・セパレータの方向がブロックの全体方向から判断される(1526)(1504を参照)。ブロック1526に続いて、ブロック1518と1520が前述したように実行され、そのあと方向解明処理1500は完了し、戻る。
図18は本発明の第2側面による初期方向判断処理1600を示すフローチャートである。初期方向判断処理1600は図17Aのブロック1504で実行されるオペレーションと関連している。
初期方向判断処理1600は制御フラグに基づくスイッチ・オペレーションから開始される。制御フラグは次の1つを示している。すなわち、
NO_OUTPUT、L−to−RまたはR−to−Lである。これらの制御フラグはユニコード・コード変換システム400を起動するアプリケーションによってセットされる(つまり、制御フラグはコンバータへの入力である)。制御フラグがR−to−Lを示しているときは、グローバル方向はR−to−Lにセットされる(1604)。制御フラグがL−to−Rにセットされているときは、グローバル方向はL−to−Rにセットされる(1606)。制御フラグがNO_OUTPUTにセットされているときは、スモール・ループが開始され、方向が判断できるまで入力文字列のユニコード文字をスキャンしていく。ループは状態を“START STATE”にセット(1608)することから開始される。次に、ユニコード文字が入力文字列から取得される(1610)。ユニコード文字の属性が次に調べられる(1612)。属性は図9Aのブロック914で使用され、図12に詳しく説明されているものと同じ方法を用いて調べられる(1612)。次にユニコード文字の方向が属性(つまり、方向属性)を使用して判断される(1614)。方向が“NO_OUTPUT”に等しいかどうかがの判断1616が行われる。方向が“NO_OUTPUT”であれば、入力文字列の終わりまで達したかどうかの判断1618が行われる。入力文字列の終わりまで達していなければ、処理は戻り、ブロック1610〜1618を繰り返す。文字列の終わりまで達していると、判断1618は方向を見つけることなく特殊方向スキャニング・ループを終わらせる(例えば、NO_OUTPUT)。そうでなければ、スキャニング・ループは判断1616が方向を判断したとき終了する。
いずれの場合も、スイッチ・オペレーション1602に関連する方向処理に続いて、スイッチ・オペレーション1620は判断に基づいて起動される。判断された方向が2NO_OUTPUT”であるときは、現在レベルは埋め込みボトムにセットされる(1622)。他方、方向がL−to−Rであれば、現在レベルはゼロにセットされ、前のレベルはボトムにセットされ、オーバライド状況は中立にセットされる(1624)。方向がR−to−Lであるときは、現在レベルは1にセットされ、前のレベルはボトムにセットされ、オーバライド状況は中立にセットされる(1626)。レベルとは、ユニコード標準に記載されている埋め込みレベルのことである。初期方向判断処理1600の特殊方向スキャニング・ループ(例えば、1610〜1618)は図18に別ループとして示されているが、総システム処理効率は特殊方向スキャニング・ループをメイン方向スキャニング・ループ内に組み入れると向上することができる。
図19はテキスト要素ルックアップ処理1630を示すフローチャートである。テキスト要素ルックアップ処理1630はルックアップ・ハンドラ412によって実行され、ユニコード・コンバータ処理700(図7)内のブロック708によって起動される。
テキスト要素ルックアップ処理1630は変種リストをサーチし、実際の属性と要求された変種に一致するエントリを見つけることから開始される。変種のサーチ1632は図24を参照して以下で詳しく説明する。次に、一致するものが見つかったかどうかの判断1634が行われる。一致するものが見つからなければ、エラーになる(1636)。他方、一致するものが見つかれば、対応するビット・マスクが変種リストから取得される(1638)。好ましくは、変種リストは3つのフィールド、つまり、変種識別子、属性のセット、およびビット・マスクをもっている。変種リスト内の変種識別子と属性セットが実際の属性および要求された変種と一致していれば、対応するビット・マスクが変種リストから選択される。ブロック1638に続いて、ビット・マスクは許容範囲ビット・マスクと結合され(1640)選択フラグが得られる。選択フラグは上述したようにマッピング・テーブル414のサブテーブルを選択するとき使用される選択マスクを形成する。好ましくは、本発明の第2側面では、結合1640はビットワイズ・オペレーションである。好ましくは、本発明の第1、第3および第4側面では、結合1640はビットワイズORオペレーションである。次に、現在テキスト要素の長さのためのテーブルがマッピング・テーブル414内にあるかどうかの判断1642が行われる。なければ、エラーになる(1644)。他方、現在テキスト要素の長さのためにテーブルがあれば、ルックアップ・テーブルとそのフォーマットが現在テキスト要素の長さのために取得される(1646)。次に、スイッチ・オペレーション1648がフォーマットに基づいて実行される。このインプリメンテーションで利用できるフォーマットはリスト、セグメント配列、範囲およびチェーンである。フォーマットがリスト・フォーマットであれば、リスト・フォーマット処理1650が実行される。フォーマットがセグメント配列であれば、セグメント配列フォーマット処理1652が実行される。フォーマットが範囲であれば、範囲フォーマット処理1654が実行される。フォーマットがチェーンであれば、チェーン・フォーマット処理1656が実行される。ブロック1650−1656に続いて、結果が戻され(1658)、これによりテキスト要素ルックアップ処理1630は完了する。
本発明の第1側面によれば、図20はチェーン・フォーマット処理1660を示すフローチャートである。チェーン・フォーマット処理1660は図19に示すチェーン・フォーマット処理1635によって実行される処理である。
チェーン・フォーマット処理1660はチェーン内のテーブル数のチェーン・カウントを取得する(1662)。そのあと、現在のカウントはゼロにセットされる(1664)。次に、現在のカウントがチェーン・カウントより大であるか等しいかどうかの判断1666が行われる。現在のカウントがチェーン・カウントより大または等しければ、チェーン・フォーマット処理1660は戻り(1668)、結果が見つからなかったのでエラーを通知する。他方、現在のカウントがチェーン・カウントより大でも等しくもなければ、現在のルックアップ・テーブルとそのフォーマットが取得される(1670)。このインプリメンテーションで使用されるフォーマットは図19で使用されたものと同じである。そのあとスイッチ・オペレーション1672がフォーマットに基づいて実行される。フォーマットがリストであれば、リスト・フォーマット処理1674が実行される。フォーマットがセグメント配列であれば、セグメント配列フォーマット処理1676が実行される。フォーマットが範囲であれば、範囲フォーマット処理1680が実行される。フォーマットがチェーンであれば、チェーン・フォーマット処理1682が実行される。ブロック1614〜1622に続いて、現在のカウントがインクリメントされる(1684)。次に、結果が見つかったかどうかの判断1686が行われる。結果が見つからなければ、チェーン・フォーマット処理1660はループして判断ブロック1666に戻り、テーブル・チェーン内の次のルックアップ・テーブルを調べていく。しかるに、結果が見つかったと判断1686されたときは、結果が戻され(1688)、これによりチェーン・フォーマット処理1660は完了する。
本発明の第1側面によれば、図21は範囲フォーマット処理1700を示すフローチャートである。範囲フォーマット処理1700は図19のブロック1654と図20のブロック1678によって実行される処理である。範囲フォーマットはデルタ値が各フィールドと関連づけられている文字の範囲リストである。
範囲フォーマット処理1700はそのサブテーブルのサブセット・フラグが選択フラグに一致しているかどうかを判断(1702)することから始まる。選択フラグは選択マスクに対するもので、サブセット・フラグはサブテーブル・マスクに対するものである。一致していなければ、範囲フォーマット処理は戻り(1704)、結果が見つからなかったことをエラー・コードで通知する。他方、そのサブテーブルのサブセット・フラグが選択フラグに一致していることを判断1702が示していれば、テキスト要素の長さが1より大であるかどうかの判断1706が行われる。テキスト要素の長さが1より大であれば、このフォーマットは誤って選択されたことになる。この特定インプリメンテーションでのマッピング・テーブルの構成は範囲フォーマットが長さ1のテキスト要素だけを目的とするようになっているためである。従って、テキスト要素が1より大であれば、ブロック1704が実行されて戻り、結果が見つからなかったことを通知する。他方、テキスト要素の長さが1より大でなければ、範囲フォーマット処理1700は続行される。範囲フォーマットをもつサブテーブルは範囲配列をもち、各範囲はそれぞれに関連づけられたデルタ値をもっている。次に、範囲配列がサーチされ(1708)、変換されるユニコード文字の該当する範囲が見つけられる。範囲が見つかったかどうかの判断1710が行われる。範囲が見つからなければ、範囲フォーマット処理1700は戻り(1704)、結果が見つからなかったことをエラー・コードで通知する。しかるに、結果が見つかったときは、その範囲の対応するデルタ値が取得される(1712)。次に、このデルタ値はユニコード値に加えられる(1714)。そのあと、その結果は出力シーケンスにマッピングされる(1716)。結果を出力シーケンスにマッピングする処理は図22A〜図22Cを参照して以下で詳しく説明する。ブロック1716に続いて、範囲フォーマット処理は完了し、戻る。
本発明の第1側面によれば、図22はリスト・フォーマット処理1800を示すフローチャートである。リスト・フォーマット処理1800は図19のブロック1650と図20のブロック1674によって実行される処理である。リスト・フォーマットはテキスト要素が配列されたリストであり、この配列リストまでのインデックスiは対応するルックアップ・ターゲット・リストまでのインデックスである。
リスト・フォーマット処理1800はそのサブテーブルのサブセット・フラグが選択フラグに一致しているかどうかの判断1802から始まる。一致していなければ、リスト・フォーマット処理1800は戻り(1804)、マッピングが見つからなかったことをエラー・コードで通知する。他方、そのサブテーブルのサブセット・フラグが選択フラグに一致していれば、リスト内のテキスト要素に基づいて最適化バイナリ・サーチが行われる(1806)。次に、サーチがリスト内のテキスト要素を見つけたかどうかの判断1808が行われる。見つからなければ、再びリスト処理は戻り(1804)、マッピングが見つからなかったことを通知する。しかし、テキスト要素が見つかれば、テキスト要素が見つかった個所のインデックスiが取得される(1810)。このインデックスiはルックアップ・ターゲットを取得する(1812)ために使用される。次に、ルックアップ・ターゲットは出力シーケンスにマッピングされる(1814)。これでリスト・フォーマット処理は完了し、戻る。
本発明の第1側面によれば、図23Aと図23Bはセグメント配列フォーマット処理1900を示している。セグメント配列フォーマット処理1900は図19のブロック1652と図20のブロック1676によって実行される処理である。セグメント配列フォーマットは第1テキスト要素配列、最終テキスト要素配列、およびn個のオフセット配列を含んでいる。オフセット配列内のオフセットは種々のルックアップ・ターゲット・リストを指している。
セグメント配列フォーマット処理1900はそのサブテーブルのサブセット・フラグが選択フラグに一致しているかどうかの判断1901から始まる。サブセット・フラグが選択フラグに一致していれば、最適化サーチが行われる(1902)。最適化サーチは最終テキスト要素配列内にあって、探索していたテキスト要素よりも大であるか等しい最小エントリを見つけ、そのエントリのインデックスiを取得する。次に、第1テキスト要素配列内のi番目のエントリが探索していたテキスト要素より小であるか等しいかどうかの判断1904が行われる。そうでなければ、セグメント配列フォーマット処理1900は戻り(1906)、マッピングが見つからなかったことをエラー・コードで知らせる。また、判断1901が失敗した場合には、ブロック1906も実行される。他方、最初のテキスト要素配列内のi番目のエントリが探索していたテキスト要素より小であるか等しいことを判断1904が示しているときは、i番目のエントリは探索していたテキスト要素に対応することが分かる。そのあと、ルックアップ・ターゲット・リストがオフセット配列内のi番目のエントリを通して取得される(1908)。すなわち、オフセット配列内のi番目のエントリに入っているオフセットはルックアップ・ターゲット・リストを示している。ルックアップ・ターゲット・リストまでのインデックスjが次に判断される。インデックスjは探索していたテキスト要素の値から、取得(1908)したルックアップ・ターゲット・リスト(または範囲)内の第1テキスト要素を引いた値が与えられる。インデックスjをもつルックアップ・ターゲットが次にルックアップ・ターゲット・リストから取得される(1912)。次に、ルックアップ・ターゲットがゼロに等しいかどうかの判断1914が行われる。ルックアップ・ターゲットがゼロに等しければ、セグメント配列フォーマット処理は戻り、マッピングが見つからなかったことをエラー・コードで通知する。他方、ルックアップ・ターゲットがゼロに等しくなければ、ルックアップ・ターゲットは出力シーケンスにマッピングされる(1918)。ブロック1918に続いて、セグメント配列フォーマット処理1900は完了し、戻る。
図24はサーチ変種リスト処理2000を示すフローチャートである。サーチ変種リスト処理2000は図19のブロック1632によって実行される処理である。言い換えれば、サーチ変種リスト処理2000はマッピング・テーブル414を使用してルックアップ・ハンドラ412によって実行されるルックアップ・テキスト要素処理1630の一部である。
サーチ変種リスト処理2000は変種リスト内の要素の総カウントを取得する(2002)。そのあと、現在のカウントがゼロに初期化される(2004)。現在のカウントが総カウントより大であるか等しいかどうかの判断2006が行われる。現在のカウントが総カウントより大または等しければ、サーチ変種リスト処理2000は戻り(2008)、変種が見つからなかったことをエラー・コードで通知する。他方、現在のカウントが総カウントより大または等しくなければ、変種リスト内にあって、現在のカウントに関連するエントリが実際の属性および要求された変種に一致しているかどうかの判断2010が行われる。一致していれば、変種リスト内のエントリからの変種フラグが戻される(2012)。一致していなければ、現在のカウントはインクリメントされ(2014)、そのあと処理はブロック2006に戻り、変種の1つが一致するか、あるいは変種のすべてが考慮されるまでループを続けて変種リスト内の使用可能な変種を見つける。
図25Aおよび図25Bは変種リスト2100を示す概略図である。図25Aに示すように、変種リスト2100は変種領域2102、所望属性領域2104および変種フラグ領域2106を含んでいる。図25Bは好ましいインプリメンテーションによる実際属性ビット・マスクを示す図である。実際属性ビット・マスク2108は32ビット変数であり、シメトリック・スワッピング状態を示す第1部分2110(ビット0と1)、垂直または水平形式を示す第2部分(ビット2と3)、解明方向を示す第3部分(ビット8と9)、およびコンテキストを示す第4部分(ビット16〜19)をもっている。本発明の第3側面によれば、第4部分2116のビットはコンテキスト処理984(図10C)で判断されたコンテキスト・マスクによってセットされる。さらに、本発明の第1ないし第4側面によれば、部分内の各ビットはフラグを表している。ビットはフラグが未知であるか、あるいはセットされていなければ、値が“0”であり、セットされているときは値は“1”になっている。呼び出し側は第2部分2110をセットし、スキャナ408は第1、第2および第4部分2110、2114および2116をセットする。
所望属性ビット・マスクは実際属性ビット・マスクと同じフォーマットであるが、ビットは属性のどれが特定テーブルおよび変種の正しいマッピングを得るために重要であるかに応じてセットされる(これはマッピング・テーブル414の設計によって決まる)。所望属性ビット・マスク内のビットはマッピング判断の際に考慮される各属性には“1”がセットされ、ある部分のすべてのビットが“1”にセットされていれば、属性はマッピング期間には無視される。例えば、ビット0が“1”で、ビット1が“0”ならば、シメトリック・スワッピングはオンであり、マッピングが行われるとき考慮される。他方、ビット0と1が共に“1”であれば、シメトリック・スワッピングは完全に無視される。所望属性ビット・マスクの残りの未使用ビットは“1”にセットされ、必要ならばあとで値を割り当てることができる。以下、所望属性ビット・マスクの例をいくつか示して説明する。
方向が左から右へであり、他の属性はいずれも重要でないとする。そうすると所望属性ビット・マスクはxFFFFFDFFとなる。これに対して、方向が右から左へであり、シメトリック・スワッピングがオンであるとすると、所望属性ビット・マスクはxFFFFFEFDとなる。方向が右から左へで、シメトリック・スワッピングがオフであれば、所望属性ビット・マスクはxFFFFFEFEとなる。上記の異種所望属性ビット・マスクの各々によると、異なる変換コードを選択することができる。例えば、ユニコード文字u0028をMacArabicにマッピングすると、所望属性ビット・マスクxFFFFFDFFではx28が、所望属性ビット・マスクxFFFFFEFDではxA8が、所望属性ビット・マスクxFFFFFEFEではxA9が得られる。
本発明の第1側面によれば、図26A、図26Bおよび図26Cはルックアップ・ターゲットの出力シーケンスへのマッピング処理2200を示すフローチャートである。ルックアップ・ターゲットの出力シーケンスへのマッピング処理2200は図22のブロック1814および図23Aのブロック1918に関連している。
ルックアップ・ターゲットの出力シーケンスへのマッピング処理2200は間接が許されるかどうかの判断2202から始まる。間接が許されなければ、ルックアップ・ターゲットはcharsizeの断片で出力シーケンスにコピーされる(2204)。charsizeとは、ターゲット・コード化内の文字の最小サイズのことであり、マッピング・テーブル414のヘッダ500に指定されている。ブロック2204に続いて、処理200は完了し、結果が見つかったとの通知を出して戻る(2206)。他方、間接が許されると判断2202が判断したときは、ルップアップ・ターゲットの上位ビットが1に等しいかどうかの判断2208が行われる。上位ビットが1に等しくなければ、第1バイトがヌル出力シーケンス(つまり、長さが0の出力シーケンス)を示しているかどうかの判断2210が行われる。第1バイトがx7Fを示していれば、ヌル出力シーケンスが示される(2212)(一致するものが見つかったが、文字は出力シーケンスに追加されない)。他方、第1バイトがヌル出力シーケンスを示していないときは、charsizeの断片が出力シーケンスにコピーされる(2214)。その場合には、第1バイトは出力シーケンスの長さを示していることが好ましい。ブロック2212と2214に続いて、ブロック2206が実行され、これにより処理は完了し、結果が見つかったことを通知して戻る。
しかるに、ルックアップ・ターゲットの上位ビットが1に等しいと判断2208が判断した場合には、ルックアップ・ターゲットは所望の出力シーケンスを間接的に参照しているので追加の処理が必要になる。具体的には、間接シーケンスまでのオフセットがルックアップ・ターゲットの残余部分を使用して指定される(2216)。ルックアップ・ターゲットの残余部分の上位ビットが1に等しいかどうかの判断2218が行われる。等しくなければ、charsizeの断片が出力シーケンスにコピーされ(2220)、そのあと処理2200はマッピングが見つかったとの通知を戻して(2200)完了する。他方、ルックアップ・ターゲットの残余部分の上位ビットが1に等しいと判断されていれば(2218)、順次チェーン内のシーケンスのカウントが取得され(2224)、リニア・サーチがシーケンスを通るように行われ、マッピングが特定される。ブロック2226に続いて、前述したブロック2220と2222が実行される。
図26Cは図26Bのブロック2226によって実行されるオペレーションの詳細図である。すでに説明したように、図26Cのブロック2226はシーケンスを通るリニア・サーチを実行する。最初に、現在のカウントがゼロにセットされる(2228)。現在のカウントがシーケンス・カウントより大または等しいかどうかの判断2228が行われる。現在のカウントがシーケンス・カウントより大または等しければ、ルックアップ・ターゲットの出力シーケンスへのマッピング処理2200はマッピングが見つからなかったとの通知と共に戻る(2232)。他方、現在のカウントがシーケンス・カウントより大または等しくなければ、次の出力シーケンスとそのシーケンス・マスクが取得される(2234)。シーケンス・マスクは複数の出力シーケンスの1つを選択するために使用されるマスクである。次に、サブセット・フラグが使用中であるかどうかの判断2236が行われる。サブセット・フラグが使用中でなければ、シーケンス・マスクと論理ANDがとられた実際属性が実際属性にビットワイズに等しいかどうかの判断2238が行われる。そうであれば、マッピングが見つかったので処理は上述したブロック2220と2222を実行する。他方、サブセット・フラグが使用中であると判断(2236)されたときは、シーケンス・マスクと論理ANDがとられた選択フラグがビットワイズにシーケンス・マスクと等しいかどうかの判断2240が行われる。そうであれば、マッピングが見つかったので前述したブロック2220と2222が実行される。従って、ブロック2238と2240は異なった方法で正しい出力シーケンスを取得する。他方、どちらかの判断ブロック2238または2240が現在のシーケンスが正しいマッピングでないと示していれば、現在のカウントはインクリメントされ(2242)、処理はブロック2230に戻ってチェーン内の次のシーケンスのオペレーションを続ける。
図27は本発明によるフォールバック・ハンドリング処理2300を示すフローチャートである。フォールバック・ハンドリング処理2300はフォールバック・ハンドラ416によって実行され、図7に示すユニコード・コンバータ処理700のブロック716によって起動される処理である。
フォールバック・ハンドリング処理2300はフォールバック・オプションを使用してテキスト要素を調べる(2302)。ルックアップ2302は図19を参照して上述したテキスト要素ルックアップ処理1630に類似している。唯一の重要な違いは、変化した選択フラグを通して追加サブセットが考慮されるようにフォールバック・オプションがセットされていることである。次に、テキスト要素の変換コードが見つかったかどうかの判断2304が行われる。変換コードが見つかっていれば、変換またはマッピングを取得するときにどのフォールバックが使用されたかを示すようにエラー・コードがセットされる(2306)。ブロック2306に続いて、フォールバック・ハンドリング処理2300は完了し、戻る。
他方、判断2304が変換コードが見つからなかったと示しているときは、フォールバック・オプションに基づいてスイッチ・オペレーション2308が実行される。フォールバック・オプションには、次のものがある。すなわち、デフォルト、呼び出し側定義、呼び出し側定義を伴うデフォルト、またはデフォルトを伴う呼び出し側定義である。フォールバック・オプションがデフォルトであれば、スイッチ・オペレーション2308はデフォルト処理2310を実行させる。フォールバック・オプションが呼び出し側定義であれば、スイッチ・オペレーション2308は呼び出し側定義のオペレーション2312を実行させる。フォールバック・オプションが呼び出し側定義を伴うデフォルトであれば、スイッチ・オペレーション2308はデフォルト処理を実行させ(2314)、続いて判断2316と呼び出し側定義の処理を実行させる(2318)。判断2316はデフォルト処理が正常に行われると、呼び出し側定義処理2318をバイパスするように働く。フォールバック・オプションがデフォルト処理を伴う呼び出し側定義であれば、スイッチ・オペレーション2308は呼び出し側定義処理を実行させ(2320)、続いて判断2322とデフォルト処理を実行させる(2324)。判断2322は、呼び出し側定義処理2320が正常に行われたときは、デフォルト処理2324をバイパスするように働く。スイッチ・オペレーション2308に関連する処理に続いて、フォールバック処理2300がマッピングまたは変換コードを正常に特定していたかどうかの判断2326が行われる。フォールバック処理2300が失敗していれば、文字セットのデフォルト・フォールバック文字シーケンスが取得される(2328)。デフォルト・フォールバック文字シーケンスとは、フォールバック・ルックアップ2302が変換コードを特定するのに失敗したとき使用される変換コードである。好ましくは、デフォルト・フォールバック文字シーケンスはマッピング・テーブル414のヘッダに収められている。例えば、ASCIIでは、デフォルト・フォールバック文字シーケンスは“?”であるのが普通である。そのあと、ブロック2328に続いて、またはフォールバック処理がマッピングまたは変換コードを取得するのに成功したときはブロック2326に続いて、フォールバック・オプションが使用されたことを示すエラー・コードがセットされ(2306)、フォールバック・ハンドリング処理2300は完了し、戻る。
図28はデフォルト処理2400を示すフローチャートである。デフォルト処理は図27のブロック2310、2314および2324で実行される処理と関連している。
デフォルト処理2400は最初に現在のカウントをゼロにセットする
(2402)。次に、現在のカウントがテキスト要素の長さより大であるか等しいかの判断2404が行われる。そうであれば、デフォルト処理2400は完了し、戻る。そうでなければ、フォールバック・フラグがセットされた単一ユニコード文字に対してルックアップ処理が実行される(2406)。ここでは、ルックアップはテキスト要素の個別文字に対するものであるが、以前(ブロック3202)では、ルックアップはテキスト要素全体に対するものであった。そのあと、単一ユニコード文字の変換コードが見つかったかどうかの判断2408が行われる。見つからなければ、ユニコード文字で使用できる個別マッピングがなかったことをエラー・コードで通知してデフォルト処理2400は戻る(2410)。他方、変換コードが見つかっていれば、現在のカウントがインクリメントされ(2412)、処理はテキスト要素内の次のユニコード文字の処理を行うためにブロック2404に戻る。
上述した図4〜図28はユニコードからターゲット・コード化への変換(ユニコードから)に関するものであるが、上述したように、ユニコード・コード変換システム300は異なるソース・コード化からユニコードに変換する(ユニコードへ)機能も等しく備えている。ユニコードへはユニコードからの処理と類似しているが、実質的には複雑度が軽減されている。ユニコードへの処理はターゲット・コード化を判断するときテキスト要素を探すためにスキャンしたり、複数の文字シーケンスを調べたりする必要がないのが通常である。ユニコードへの処理はソース文字列を個々の文字に分割し、そのあとでユニコードの対応するコード・ポイントを見つけるだけである。しかし、文字のマッピングがそのあとに続く文字に影響されるようなまれな場合には(例えば、デーヴァナーガリーのようなインド・スクリプト)、上述したようにスキャンが行われる場合がある。
図29は本発明によるユニコード・コード変換システム2500の実施例を示すブロック図である。ユニコード・コード変換システム2500はユニコードへの変換を行う(つまり、ユニコードへの処理)。ユニコード・コード変換システム2500はユニコードへのコンバータ2502を含み、このコンバータはソース文字列2504を受信し、ユニコード文字列2506を出力する。ユニコードへのコンバータ2502はスキャナ2508とやりとりするユニコードへのコンバータを通してコード変換プロセスを実行する。スキャナ2508はスキャナ・テーブル2510を使用して、ソース文字列2504をスキャンしソース文字列2504を文字に分断する。ここでは、ユニコードからの場合と異なり、ソース文字列は個々の文字に分割されるだけである。次に、ユニコードへのコンバータ2502はルックアップ・ハンドラ2512を使用して個別文字を調べそのユニコード・コード化を取得する。ルックアップ・ハンドラ2512はマッピング・テーブル2514を使用してユニコードの文字を取得する。さらに、ユニコードへのコンバータ2502はフォールバック・ハンドラ2516を使用することもできる。フォールバック・ハンドラ2516はマッピング・テーブル2514と一緒に動作して、ルックアップ・ハンドラ2512がユニコード文字を特定できなかった場合に、テキスト要素のフォールバック・マッピングとして使用できるターゲット・コード化内の1つまたは複数の文字を特定する。
スキャナ2508、スキャナ・テーブル2510、ルックアップ・テーブル2512、マッピング・テーブル2514、フォールバック・ハンドラ2516、状態管理機構2518は図4の対応するデバイスと類似しているが、実質的には複雑度が軽減されている。従って、これらのデバイスはユニコードへとユニコードからの両方の処理を実現するように設計することができる。さらに、与えられたコンピュータ・システムや他のエレクトロニック・デバイスがユニコードへとユニコードからの両方の処理を実行する機能を備えているときは、そのコンピュータ・システムや他のエレクトロニック・デバイスはハブとして動作することができる。このハブはユニコードがサポートする種々の各国語文字間で変換を行うように動作することができる。例えば、ソースの各国語文字セットはまずユニコードに変換され、次にターゲットの各国語文字セットに変換される。
本発明の第1側面によれば、上述したテーブルは、好ましくは、上述したフォーマットを使用してテーブルにストアすべきデータの圧縮を行う。さらに、本発明の第1側面によれば、圧縮を重視している。例えは、圧縮すると、属性テーブルは50倍(50対1)に小さくなる。しかし、本発明の第1側面によれば、この分野の精通者ならば理解されるように、テーブルのフォーマットは多数の形体をとることができるので、あるテーブルは他のテーブルよりも実現が容易になる。最も容易な実現はどの圧縮も使用しないテーブルであるが、そのためには最大のデータ記憶装置が必要になる。さらに、本発明の第1側面によれば、テーブルは上述したインプリメンテーションで使用されているが、これらのテーブルで引き起こされる振舞を直接にコーディングすることも可能である。しかし、直接コーディングはコード変換システムのオペレーションの変更を困難にするのに対し、テーブルを使用すると、そのような変更を取り入れるためにテーブルだけを変更するだけで済むのが普通である。
本発明の多数の特徴および利点は上述してきた説明で明らかにした通りであり、本発明のかかる特徴と利点はすべて請求の範囲に記載されている。さらに、本発明はこの分野の精通者が容易に理解されるように、種々態様に変更することが可能であるので、本発明は上述してきた正確な構造とオペレーションに限定されるものではない。従って、すべての適当な変更および等価技術は本発明の範囲に属するものである。