Uctrans

開発のいきさつ

    「Uctrans」(Unicode translator、「UCトランス」と読んで下さい)はMacOSに付属するText Encoding Converter(TEC)を利用した漢字コードコンバーターです。REALbasicにTECを利用できる「TextConverterクラス」が含まれており、これを利用してS-JIS、GB、BIG-5からUnicodeへ、またはその逆の変換をするコード変換ツールを作ってみました。自前の変換テーブルを使用した漢字コンバーター「KCTRANS」と変換性能を比較しようという意図もあります。

Uctransの機能

    「Uctrans」が取り扱う変換は以下の通りです。

入力

  • *MacJapanese(S-JIS)
  • *MacSimp.Chinese(GB)
  • *MacTrad.Chinese(Big-5)
  • *Unicode(UTF-16,UTF-7,UTF-8,Escape Sequence)

出力

  • *MacJapanese(S-JIS)
  • *MacSimp.Chinese(GB)
  • *MacTrad.Chinese(Big-5)
  • *Unicode(UTF-16,UTF-7,UTF-8,Escape Sequence)

    変換はREALbasicのクラスの仕様に依存しており、未変換文字について特別の処理はしていません。対照表は以下の通りです(O:変換、*:コピー、Xはコピーまたはバイトオーダーの変換)。

UctransConversionTable.png

変換例

「Uctrans」のGB→S-JISの変換結果の一例を以下に示します。変換元は『人民日報』(1999-12-06)の記事の一部です。

図1 中国のGBコードで書かれたテキストファイル Original File 図2 上記ファイルを日本のシステムで見た時の表示の一例 Original File(View from JP system) 図3 上記ファイルを「Uctrans」でGB→JIS変換した結果 Converted File(View from JP system)

フォールバック

    「Settings」ダイアログで未変換漢字のフォールバック機能(エスケープシーケンス=代替文字列の出力)を選ぶと「?」の代わりに「Tag+XXXX+Delimiter」(Xは16進数)の形式で変換元の漢字コード(内部形式)を出力します。「Tag」「Delimiter」は利用者が設定できます。下の例に含まれる「_CAF5_」は「Uctrans」が変換できなかった漢字の代替文字列表現で、「Tag」と「Delimiter」はともに「_」と設定、コードはGB(内部表現)の$CAF5だったことを示します。

図4 上記ファイルを「Uctrans」でGB→JIS変換した結果(フォールバック付き) Converted File with fallback(View from JP system)

    「Uctrans」のフォールバック機能は以下のように設定されています。

  • S-JIS、GB、BIG-5相互間の変換では元ファイルのコードを出力
  • UTF-16からS-JIS、GB、BIG-5への変換では元ファイルのコード(つまりUnicode)を出力
  • Unicode Escape Sequence出力を選んだ場合は、強制的にUnicodeを代替文字列として出力

    利用者は上記のフォールバック機能と、適切な「Tag」と「Delimiter」を組み合わせることで、さまざまな処理系や言語でのUnicode表現を得ることができます。

  • HTML:Tag="&#x " Delimiter=";"
  • Java:Tag="¥u" Delimiter=なし
  • Perl:Tag="¥x{" Delimietr="}"

変換結果比較

    「Uctrans」と「KCTRANS」の変換を比較してみます(GB→S-JIS)。

図5 「Uctrans」による変換(フォールバックなし) Converted File(View from JP system) 図6 「KCTRANS」による変換 Converted File(View from JP system)

    「Uctrans」で「广州」「广東省」(1.)となっている部分は「KCTRANS」では「州」「東省」となっています。UnicodeのCJK漢字コード統合が「字形の同一性による」という原則に基づいており、このため「Uctrans」(が依存するTextConverterクラス)も、この原則に沿い、GB:「广」をS-JIS:「广」と変換する。一方「KCTRANS」は漢字簡略化政策(日本や中国)の結果を加味し、またSJISの字体については「正字体」を標準としているため、GB:「广」をS-JIS:「廣」と変換します。

    また「KCTRANS」は意味や出現環境を考慮して異体字・ひろく行われている慣用字までを考慮して同一性を判断する立場をとっています。従って「Uctarns」(あるいは、それが依存するTEC)が「対応する漢字がない」として「?」を出力する「技?」(1-4.)「海?」(2.)「?示」(2.)は、「KCTRANS」ではそれぞれ「技」「海」「示」と可読な形で出力します。

    一般には「Uctrans」より「KCTRANS」のほうが未変換文字は少なくなるはずです。ただ上記のような漢字の認定原則であるため、「KCTRANS」の変換が「Uctrans」よりも過剰な変換を行う可能性があります。詳しくは「About KCTRANS」の【変換辞書】や【註】を参照して下さい。