SableVMで日本語Encoding(Windows-31J)の追加方法


SableVMが使用しているSableVM-Classpath(Sunのrt.jarに相当)にはShift_JIS、Windows-31J、EUC-JPなどの日本語Encodingがデフォルトの状態では利用できません。日本語を利用できる状態にするには幾つかの手段があります。

SableVMで日本語を使うには3段階の選択があります。

1.UTF-8を使用する
この場合特に何も考慮する必要はありません。UTF-8はデフォルトの状態で使用可能です。

2.Shift_JIS、EUC-JPを使用する
システムに導入されたiconvでサポートされたEncodingを使用します。iconvから使用するEncodingはSableVMのIconvProviderで実装されていて幾つかピックアップしたものが利用可能になります。
このIconvProviderを使用するにはjavaの起動引数で-Dgnu.classpath.nio.charset.provider.iconvを追加します。
_
例)java -Dgnu.classpath.nio.charset.provider.iconv DisplayCharsets
※iconvでサポートしているCharsetは iconv -l で確認できます。

3.Windows-31Jを使用する
iconvでは利用可能ですが、SableVMのIconvProviderがサポートしていないため、java標準のAPIとして用意されているCharsetProviderを使用してWindows-31Jが利用可能になるようにします。用意の方法はJ2SEのAPIリファレンスを参考にしてください。下記の手順を行えば簡単にできます。
Windows-31JのEncoding実装をゼロから行うのは大変なのでGNUライブラリのIconvProvider経由でiconvを利用する方法を取りました。

Shift_JISは、J2SE1.4.2から、NEC特殊文字やIBM拡張文字が含まれなくなり~, ∥, -, ¢, £, ¬などが文字化けするようになりました。特に~は良く使うのでこれに対応するにはWindows-31Jを使用する必要があります。なので、ここでは3段階目のWindows-31Jを利用可能にするための手順を残します。


Tomcat4を起動している場合は手順実施後に再起動が必要です。

KUROBOX-PRO:~# /usr/lib/sablevm/jre/lib
KUROBOX-PRO:/usr/lib/sablevm/jre/lib# mkdir ext
KUROBOX-PRO:/usr/lib/sablevm/jre/lib# cd ext
KUROBOX-PRO:/usr/lib/sablevm/jre/lib/ext# wget http://osdn.dl.sourceforge.jp/jeextension/25691/gnu-charset-ja-jp-1.0.2.jar
KUROBOX-PRO:/usr/lib/sablevm/jre/lib/ext# ls -l
total 12
  • rw-r--r-- 1 root root 3019 Jun 4 18:32 gnu-charset-ja-jp_1.0.2.jar

※すべてEncode、Decodeの処理をiconvに委譲するよう1.0.2で変更しました
※Alias(Windows-31JのAlias MS932など)が有効になっていなかったのでバージョンを1.0.1に変更しました
※なぜか/usr/lib/fjsdk/jre/lib/extの指す/usr/lib/sablevm/jre/lib/extがないため、extを作成してからwgetでCharsetProviderをダウンロードします。
※1.0.2よりソースを公開しています。https://sourceforge.jp/projects/jeextension/

試しにサンプルプログラムで有効なCharsetをすべて表示してみます。
KUROBOX-PRO:~# vi DisplayCharsets.java
public class DisplayCharsets {
    public static void main(String[] args) {
        java.util.Map map = java.nio.charset.Charset.availableCharsets();
        java.util.Iterator enum = map.keySet().iterator();
        while (enum.hasNext()) {
            String key = (String) enum.next();
            java.nio.charset.Charset val = (java.nio.charset.Charset) map.get(key);
            System.out.println(key + "=" + val.aliases());
        }
    }
}
KUROBOX-PRO:~# javac DisplayCharsets.java
KUROBOX-PRO:~# java DisplayCharsets

Shift_JIS、EUC-JP、Windows-31Jが表示されていれば成功です。


最終更新日:2007-06-04
最終更新:2007年06月04日 18:46