Javaでnative2asciiを実装の件ですが、Propertiesクラスを使って実装してみることにしました。
もともとnative2asciiは、Propertyファイルに日本語文字列を格納するためのツールであり、PropertiesクラスはそのPropertyファイルを読み込んだり書き込んだりするわけで、なにかしらの変換手段を持っているはずだからです。
JavaDocを見ると、どうやらgetProperty、setPropertyメソッドを使っているだけではUnicode変換は発生しないようです。storeメソッドでStreamに書き出したり、loadメソッドで読み出したりする際に変換が発生するとのこと。
実際にstoreメソッドで「あいうえお」と保存したとき、以下のように保存されていました。=以下の部分が変換後の文字列です。うまくこの部分を取得できれば変換が出来そうです。
##Sun Nov 19 22:55:25 JST 2006=\u3042\u3044\u3046\u3048\u304A
さらに今回はメモリ内で処理を完結させたいので、StreamにはByteArrayOutputStream、ByteArrayInputStreamを使います。以下ソースです。
Properties p=new Properties();
ByteArrayOutputStream bos=new ByteArrayOutputStream();
p.setProperty("", "変換文字列");p.store(bos, "");
int index=bos.toString().indexOf("=");
return bos.toString().substring(index+1).replaceAll("\\=", "=").replaceAll("\\:",":").replaceAll("\\#", "#").replaceAll("\\!","!").replaceAll("\\\\","\\");変換する文字列をsetPropertyで格納し、storeメソッドでその内容をByteArrayOutputStreamに保存します。そして=以下の部分をsubstringで取得します。「#、!」はコメントに使われる文字なのでエスケープされています。最後の行でこれをエスケープされてない状態に戻しています。同様にkeyとvalueの区切りに使われる「=、:」、Unicode文字の先頭に使われる「\」もアンエスケープしています。
デコードのソースは以下です。
Properties p=new Properties();
ByteArrayInputStream bis=new ByteArrayInputStream("=".concat("変換文字列").getBytes());
p.load(bis);
return p.getProperty("");文字列の前に=を連結してByteArrayInputStreamに保存した後、空文字をkeyとしてgetPropertyで取得するとデコードされます。
これで何とかnative2asciiは実装できそうです。ついでにURLエンコードとかも出来るようにしようかと考え中です。