Linux-JDK における日本語入力について
Sorry, this page is written only in Japanese.
Linux版のJDKでは、libcのlocaleの問題やスタティックリンクされているMotifの国際化がイマイチなことなどから、単純にインストールしただけでは、AWTのTextComponentに対して直接日本語入力をすることができません。
そこで私は、とりあえず以下のようにして、TextField/TextAreaに対してkinput2により日本語を直接入力できるようにしています。
- 藤原さんのページ、久松さんのページを参考にして、JDKを日本語化する。(これは必須ではありません)
- 久松さんのページからは、liblocale.soのソース、.java_wrapper、font.properties.ja が入手できますが、このうち
font.properties.ja については、X-TTなフォントサーバが生成するフォントを使うように、全面的に書き換えます。また、.java_wrapper
についてはそのまま使ってもいいと思いますが、バージョンが古いようなので、いちおうJDKにもともと付いているものを自分で書き換えて(具体的には、LD_PRELOAD
と LANG の設定を付け加えて)使っています。(変更した .java_wrapper と font.properties.ja)
- 次に Red Hat Motif 2.1 をインストールしておきます。他の商用MotifやLesstifでうまくいくかどうかは、試していないのでわかりません。
- export DYN_JAVA=1 などとして、JDKのツールが、上でインストールしたlibXm.so.2をdynamic linkするように設定する。
- appletviewer は環境変数DYN_JAVAを参照せず、常にstatic link版のjavaを使うので、$(JAVA_HOME)/bin/i686/green_threads/appletviewer
の最後の方を書き換えて、DYN_JAVAに値が設定されていればdynamic link版の java_dyn を使うようにしてやります。(変更した
appletviewer)
以上の手順で、JAVAのアプリケーションおよびアプレット(appletviewerまたはhotjava使用時のみ)上のTextField/TextAreaに対して、Cut&Pasteだけでなく、kinput2を使った日本語の直接入力が可能になりました。
私の試した範囲内では、Motifをdynamic linkさせることと、X-TTなフォントサーバが生成するフォントを使うことが、日本語を直接入力できて文字化けもしないようにする必須条件でした。
[追記: jdk116-v5からは、上記の2の作業だけでうまくいくようになりました。(つまり、外部のMotifは不要)]
しかし、現時点では以下のような問題があって、あまり実用になりません。
- TextField/TextAreaに対して、getText() はできるが、setText() がうまくいかない。
- TextField/TextArea中の日本語を含む文字列の一部を、マウスでドラッグして選択しようとしても、正しく選択されない。
- TextField内でカーソルを動かすと、日本語が文字化けすることがある。
- TextAreaに入力した日本語が正しく表示されない。具体的には、たとえば"日本語"と入力すると、その時点ではこれは表示されず、そのあとで適当に"abcdefghi"などと入力していくと、"ab"を入力した時点で"日"が表示され、"cd"を入力した時点で"本"、"ef"を入力した時点で"語"、"ghi"を入力した時点で"abc"が順次表示されるといった具合に、表示と入力がずれていきます。ただし、getText()してみると、表示されていなくても入力した文字列はすべて得られますので、あくまで表示だけの問題です。
そこで次に、Swing-1.1beta2をインストールしてJTextField/JTextAreaで試してみました。すると、上で挙げた問題点は解決しました。しかも嬉しいことに、JTextField/JTextAreaを使った場合は、X-TTのフォントを使うようにしたり、Red
Hat Motifをダイナミックリンクさせたりといった小細工を弄しなくても、kinput2を使って正常に日本語の入力と表示ができました。
現在のところは、既存のJAVAアプリケーションやアプレットでは、従来のAWTのTextField/TextAreaが使われていますので、JFCでうまくいったからといって根本的な解決にはなりませんが、世の中がみんなJDK-1.2に移行してSwingが標準になれば、かなり期待できそうです。
なお、テスト環境は以下の通りです。
- Kernel: linux-2.0.35
- X: XFree86-3.3.2
- Linux-JDK: jdk116-v5-libc5-x86
- HotJava: hjb114-generic
- JFC: swing11-beta2
- XIM: kinput2-v2-fix5-alpha1
- X-TT: xtt-fs 1.0
[れんねんのホームページへ]