正字体支那語(zh-tw)の出力

今日は、Big5の出力を作った。

現在は内部バンクを暫定的にZEROPAGEとして扱っているため、中間にUnicodeを介している。
将来的には内部はBig5バンクを作って扱う予定ですが、CCSが多すぎるのでどうなるか定かではありません。

さて、昨日書いたように、Big5→Unicodeはテーブルが多数に細分されました。

ではUnicode→Big5は、どうしたらまともに処理できるのでしょう?


変換テーブル


基本的には、Unicode番号からBig5を引く一次元の配列を作ることになるわけです。
そして多数のCCSがあるので、CCSごとに作ることになる。
原則的には、それ以外に方法はないものと思われます。

しかしそれでは、ただでさえ大きいDLLの肥大化が止まらない。
そこで、今回も少し工夫。Big5は0x8140~0xfefeまでと決まっているので、16ビットで扱う場合、MSBを削れば二種類を格納できることになる。

基本のUnicode→Big5変換表は、MSB=0をbig5-uao、MSB=1をBIG5-Etenとした。両者で異なる場合、Etenを格納し、別途big5-uaoのUnicode→Big5変換リストを作った。
また、もう一つ、HKSCSの拡張部分のみを格納したUnicode→Big5変換表も作った。

なお、1次元の表ですが、未使用部分は、おおざっぱに削って圧縮してあります。単純なアルゴリズムだけで、Unicode番号から表を参照できる。


変換のロジック


今回対応したのは、次の出力です。
Big5-Etenなど
Big5-HKSCS
big5-uao

まず、MIXTUREとして得られた符号からUnicode番号を取り出す(現在は、試験的にそのような処理としている)。
出力がHKSCSなら、HKSCSの変換表を参照し、該当文字があれば出力して終わる。
なければ、継続する処理にそのまま流す。

次いで、基本変換表を使って、Etenまたはuaoの番号を得る。uaoでの出力なら、Etenと異なるもののuaoリストも参照し、一致すれば、そのBig5番号を使う。

ここまでで、Big5のコードポイントが得られる。CCSを追加する場合は、この前段に、ゴリゴリと処理を書き足すことになります。


出力のロジック


さて、このBig5番号は、そのままでは出力できない。
なぜなら、CCSごとに、文字があったり無かったりするからです。
従って入力の時と同様に、符號區、控制符號、歐元符號、…と番号範囲をif文で確認し、その中でCCSをチェックして、出力可能なら出力する、という方法を取ることになります。

そして最後に、外字の処理をする。

Big5では、概ねどんなCCSでも、余った場所つまり空き領域には標準的な外字番号がそのまま割り当てられています。
従って、出力は最後ということになります。

但し、ここで見るのはBig5番号ではなく、変換前のUnicode番号です。外字は、原則として変換表の中に含めていないからです。

色々な拡張がありますが、Unicodeの外字領域へのマッピングは、喧嘩しないようにうまく配慮されているようで、次のようになっています。

0xe000‐0xe310 使用者造字(1)
0xe311‐0xeeb7 使用者造字(2)
0xeeb8‐0xf6b0 使用者造字(3)
0xf6b1‐0xf848 使用者造字Windows
0xf849‐0xf865 使用者造字big5-uao

従って、それぞれの範囲でif文とし、CCSごとに出力の可否を判断し、そしてCCSごとに適切なBig5番号を作って吐き出すようにします。


重複文字


調査した結果、どうやらFirefox 3バージョンのbig5-uaoの追加文字には、160文字程度の重複があるようです。
更に、big5-uaoの内部でも重複があり、設計の悪さが垣間見えます。

一旦Unicodeを介した場合、あるいは他の符号の入力から出力する場合、このどちらかを選ばなければならない訳ですが、とりあえず文字番号の大きい方が優先されるような感じで変換表を作ってあります。

2008/12/12(金)19:21 |Comments(0) |Trackback(0)

製造開発 | プログラミング | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

Big5E ホーム 正字体支那語(zh-tw)作業開始
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR