Halfwidth→Fullwidth 変換の半角スペース問題

icu4j 3.6で、

Transliterator tr = Transliterator.getInstance("Halfwidth-Fullwidth");
tr.transliterate(" "); // 空白のスペース
     #->  "\u3000"

とかなって困った。\u3000は 6文字の文字列であり、エスケープ表現ではない。

いろいろ確認してみたが、そもそもこのTransliteratorの toRules()とかを見ても半角スペースだけこれがマップされていてよくわからん。

以下、2008/04/11修正 (前は間違ってました)

仕方ないので

UnicodeSet set = (UnicodeSet)tr.getFilter();
set.remove( ' ' );
tr.setFilter(set); // これはいらないかも

とかやって対処する。この場合のキモは *remove* かと思われる。filterは「通す文字だけ」をsetされているものと仮定されているようだ。

ところで、Halfwidth-Fullwidthのインスタンスでは getFilter()がnullを返すのでさらに困る。この場合、以下の方法で対処したが、イメージとしては正しいような気がするのだが、確証が持てない。まあ、その程度の情報ということで

UnicodeSet set = (UnicodeSet)tr.getSourceSet();
set.remove( ' ' );
tr.setFilter(set);   // これがないと、何も起きなかった。sourceSetそのものを破壊することは出来ないようだ

ということは、正しいかどうかはわからないけど一般化すると

UnicodeSet set = (UnicodeSet)tr.getFilter();
if (set == null) {
  set = (UnicodeSet)tr.getSourceSet();
}
set.remove( .. );
tr.setFilter(set);

ということになるだろうか。