Javaが世の中に公開された時の日本の研究開発者への影響は、前例のないと言えるほど大きいものでした。 それらの事情については、みなさんもよくご存じでしょう。
私の場合は、日本にJavaを広めるきっかけになった「一歩先行くインターネットJava入門」の著者の一人である衛藤敏寿さんから教えてもらい、その後α版で動作するクラスブラウザdejava(現在はteikadeに改名)を試してみた時に、「Javaは私が待ち望んでいたプログラミング言語かもしれない」と思ったのがきっかけでした。
その半面、1995年の春にリリースされた1.0α版から始まり、JDK 1.1がリリースされるまでの長い間、JavaSoftからは日本語が扱えるJava環境はリリースされませんでした。 このように長い時間がかかった理由は、JavaSoftが、「日本語しか扱えない」日本語専用版ではなく、どのような言語も扱えるような国際化フレームワークとして実現することで、真にWorld Wideで使える言語を目指したからです。
そこで、JavaSoftとは別におこなわれてきたさまざまな日本語処理のための試みを簡単に紹介しましょう。
これは電子技術総合研究所の中田秀基さんが配布していた、HotJavaα3で日本語を表示するためのパッケージです。
テキストデータを内部で4バイト(上位2バイトがエンコーディングを示し、下位2バイトが文字コードを示す)のint配列として扱い、HotJavaのネイティブ部分の変更を最小にするためにJavaレベルで英文フォントと和文フォントを切り替えながら描画するように変更しています。
このパッケージは、1995年の7月というかなり初期の段階に配布され、多くの人に利用されていました。
これは日本サン・マイクロシステムズ株式会社が独自に日本語化したHotJavaα3です。
ただし、javacなどのツール類は国際化されていなかったので、appletなどのjavaのプログラム中の文字列などに対して日本語は使用できません。
また外部公開版以外にも、リソースを直接編集してメッセージまで日本語化したSUN社内版があり、後者ではタイトルバーで「日本語HotJava:」、メニューバーで「ファイル」などと日本語で表示されるようになっていました。
比較的早い時期からデモがおこなわれていたにもかかわらず、外部公開が、すでに1.0β版に移行しはじめていた時期まで遅れたという事情もあって、あまり使われなかったのが残念です。
これは日立ソフトウェアエンジニアリングが作成した日本語が使えるHotJavaβです。
秋葉原にあるショールーム「PARTNERS PLAZA」で実物を展示していましたが、一般には配布されていません。
これは沖ソフトウェアが作成した日本語が使えるHotJavaβです。
Pipinは、MacintoshのハードウェアとOSを利用して作られた家庭用コンピュータで、幕張のMac World ExpoのPipinのブースで展示されていて話題になりました。 これも一般には配布されていません。
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から、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が生まれることになりました。
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エスケープを使わなければいけません。
そこで、次のような方法がおこなわれていました。
なお、JDK 1.0.2の段階では、ISO 8859-1以外の文字を扱うことは想定していなかったこともあって、クラスファイルの読み込みに使われるDataInputStream#readUTF()にbreakが抜けていて、UTF-8に変換して3バイトに展開されるとエラーが発生するというバグがありました。 クラス中に日本語文字列が書き込まれる場合には、この修正も必要です。
ただし、このreadUTF()はクラスファイル中のUTF-8文字列を読み出すためのもので、格納したデータの先頭にデータ長があることが前提です。 だから、これをそのままUTF-8での入出力に使ってはいけません。