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);
ということになるだろうか。