JDK 1.1以前の日本語処理

Javaが世の中に公開された時の日本の研究開発者への影響は、前例のないと言えるほど大きいものでした。 それらの事情については、みなさんもよくご存じでしょう。

私の場合は、日本にJavaを広めるきっかけになった「一歩先行くインターネットJava入門」の著者の一人である衛藤敏寿さんから教えてもらい、その後α版で動作するクラスブラウザdejava(現在はteikadeに改名)を試してみた時に、「Javaは私が待ち望んでいたプログラミング言語かもしれない」と思ったのがきっかけでした。

その半面、1995年の春にリリースされた1.0α版から始まり、JDK 1.1がリリースされるまでの長い間、JavaSoftからは日本語が扱えるJava環境はリリースされませんでした。 このように長い時間がかかった理由は、JavaSoftが、「日本語しか扱えない」日本語専用版ではなく、どのような言語も扱えるような国際化フレームワークとして実現することで、真にWorld Wideで使える言語を目指したからです。

そこで、JavaSoftとは別におこなわれてきたさまざまな日本語処理のための試みを簡単に紹介しましょう。


HotJavaα3日本語化パッケージ

これは電子技術総合研究所の中田秀基さんが配布していた、HotJavaα3で日本語を表示するためのパッケージです。

テキストデータを内部で4バイト(上位2バイトがエンコーディングを示し、下位2バイトが文字コードを示す)のint配列として扱い、HotJavaのネイティブ部分の変更を最小にするためにJavaレベルで英文フォントと和文フォントを切り替えながら描画するように変更しています。

このパッケージは、1995年の7月というかなり初期の段階に配布され、多くの人に利用されていました。


HotJavaα3日本語対応版

これは日本サン・マイクロシステムズ株式会社が独自に日本語化したHotJavaα3です。

ただし、javacなどのツール類は国際化されていなかったので、appletなどのjavaのプログラム中の文字列などに対して日本語は使用できません。

また外部公開版以外にも、リソースを直接編集してメッセージまで日本語化したSUN社内版があり、後者ではタイトルバーで「日本語HotJava:」、メニューバーで「ファイル」などと日本語で表示されるようになっていました。

比較的早い時期からデモがおこなわれていたにもかかわらず、外部公開が、すでに1.0β版に移行しはじめていた時期まで遅れたという事情もあって、あまり使われなかったのが残念です。


日本語HotJavaβ (Windows95)

これは日立ソフトウェアエンジニアリングが作成した日本語が使えるHotJavaβです。

秋葉原にあるショールーム「PARTNERS PLAZA」で実物を展示していましたが、一般には配布されていません。


日本語HotJavaβ (Pipin)

これは沖ソフトウェアが作成した日本語が使えるHotJavaβです。

Pipinは、MacintoshのハードウェアとOSを利用して作られた家庭用コンピュータで、幕張のMac World ExpoのPipinのブースで展示されていて話題になりました。 これも一般には配布されていません。


JDK 1.0.2

JDK 1.0.2までは、次のようにUnicodeの最初の256文字、つまりISO-8859-1相当のBasic LatinとLatin-1 Supplementしかサポートしていません。

たとえば、各プラットフォームで使われているEUCやShift-JISのテキストをUnicodeに変換する機能はありませんし、なんとかUnicodeに変換してStringオブジェクトを生成しても、これを表示することはできませんでした。

ところが、このような環境でも日本語を表示することができる環境もありました。

たとえば、Macintoshでは、"Osaka"などのプラットフォームの日本語フォントを指定することができました。 また、MacintoshではFontPatchin'を、Windowsでは「孔明」などの、アプリケーションのフォントの設定を変更するソフトウェアを使うことで、強制的に日本語フォントを使用させることができます。

このような環境では、Blinkなどのアプレットのparamタグで指定されたShift-JIS文字列は、Unicodeに変換されずにStringオブジェクトにそのまま格納されるのですが、文字列を描画する時にもそのまま渡されるので、日本語フォントで表示できました。

しかし、本来Unicodeに変換されて一文字で扱うはずの文字が、2文字として扱われるなど、さまざまな問題がありましたので、この方法はNetscape NavigatorやInternet Explorerで日本語表示が可能になった後は、ほとんど使われなくなりました。


Netscape Navigator 3.0

Netscape Navigator 3.0から、Windows 95、NT、Macintosh、Solaris 2などの主要なプラットフォームで、Unicodeサポートが追加されました。(3)

まず、AWTでUnicodeが扱えるように拡張が加えられました。 たとえば、既存のフォント、キーボードマッピング、インプットメソッドなどをそのまま使いながら、キーボードからの入力された日本語文字列をUnicodeに変換されたStringオブジェクトとして受け取ったり、逆に日本語を含むStringオブジェクトを指定して描画することができました。

さらに、paramタグで指定された属性文字列の変換がサポートされています。 たとえば、ドキュメントがJISコードで記述されていれば、appletのparam属性で指定した文字列がJISコードからUnicodeに変換され、JavaプログラムではStringオブジェクトとして扱うことができます。

これによってBlinkやNervousTextなどの既存のappletにあまり修正を加えないで日本語が使用できるようになり、JDK 1.0.2の段階でも多くの日本語appletが生まれることになりました。


Internet Explorer 3.0

Netscape Navigator 3.0に続いて、Internet Explorer 3.0に日本語サポートが加わりました。 Internet Explorerの仕様は、Netscape Navigatorとほぼ同等です。

まずUnicode APIをサポートしたことで、日本語文字列が使えるようになりました。 読み込まれた「ローカルなコードページ」(シフト JIS など)を「Unicode」に変換したり、拡張フォントをサポートしたことで日本語の表示ができるようになっています。

さらにJava アプレットでキーボード入力モード(IMEモード)の切り換えやカナ漢字入力が可能になっています。


エンコーディング変換

Netscape NavigatorとInternet Explorerでは、HTMLファイル中に指定した文字列を自動的に変換する機能はありますが、通信などの外部との入出力のためにプログラム中でエンコーディング変換するための機能は備わっていませんでした。 また、Javaのソースコード中で日本語文字列を指定するためには、Unicodeエスケープを使わなければいけません。

そこで、次のような方法がおこなわれていました。

  1. ソースコード中の日本語文字列のUnicodeエスケープへの変換
    ソースコード中の日本語文字列をUnicodeに変換します。 たとえば、筑波大学の久野靖さんが作成したJ2UCなどのツールがあります。
  2. Unicodeと漢字コードの相互変換
    日本語の入ったchar配列やStringオブジェクトを、Unicodeで格納しなおします。 たとえば、谷真琴さんの作成したEUC2UNICODE.javaなどのクラスがあります。
  3. Unicode<->UTF-8<->漢字コード変換
    一度日本語テキストをUTF-8に変換してJavaアプレットに送信し、Javaアプレット中でUnicodeに戻します。 Unicodeと漢字コードの相互変換には変換テーブルが必要になりますが、UnicodeとUTF-8の相互変換は簡単なアルゴリズムでおこなえるので、アプレットのサイズを押さえることができます。 任意のコードとUnicodeまたはUTF-8の相互変換ツールには、tcsなどがあります。

なお、JDK 1.0.2の段階では、ISO 8859-1以外の文字を扱うことは想定していなかったこともあって、クラスファイルの読み込みに使われるDataInputStream#readUTF()にbreakが抜けていて、UTF-8に変換して3バイトに展開されるとエラーが発生するというバグがありました。 クラス中に日本語文字列が書き込まれる場合には、この修正も必要です。

ただし、このreadUTF()はクラスファイル中のUTF-8文字列を読み出すためのもので、格納したデータの先頭にデータ長があることが前提です。 だから、これをそのままUTF-8での入出力に使ってはいけません。


参考資料

  1. 有我成城、衛藤敏寿、佐藤治、白神一久、西村利浩、村上列: 一歩先行くインターネットJava入門 - 最新オブジェクト指向プログラミングの深き味わい -, 翔泳社, 1996.
  2. JavaHouse Mailing List
  3. 中田秀基: HotJavaα3日本語化パッケージ README.jp, 1995.
  4. 日本サン・マイクロシステムズ株式会社: HotJava(TM)alpha3 日本語対応版 README.ja, 1995.
  5. Frank Yung-Fong Tang: Implementing Unicode In Netscape Navigator, http://home.netscape.com/people/ftang/paper/unicode9/page0001.htm, 9th International Unicode Confernce, 1996.
  6. 久野靖: J2UC
  7. 谷真琴: EUC2UNICODE.java
  8. 谷真琴: DataInputStream#readUTF()の修正方法
  9. Andrew Hume: tcs, Plan 9 Project

風間 一洋 (Ingrid Project)