ICU library での文字セット変換
ICU library は文字セット変換の機能を持っていて、ucnv.h の UConverter を使います。 この UConverter 実は callback 関数を登録できて、UTF-8 文字列からでも ASCII 文字セットに変換することができま

kwiさんのブログ記事

前へ[ cygwin C++ ]
[ EF-S15-85 のチェックポイント ]次へ

ICU library での文字セット変換

spacer
ICU library は文字セット変換の機能を持っていて、ucnv.h の UConverter を使います。

この UConverter 実は callback 関数を登録できて、UTF-8 文字列からでも ASCII 文字セットに変換することができます。ちょうど Java での native2ascii のような動作をさせることもできます。

たとえば ICU に付属の uconv を使って次のようにします。
$ uconv -f UTF-8 -t ISO8859-1 --callback escape-java utf8.txt
\u30C6\u30B9\u30C8

utf8.txt の中には「テスト」と書かれていたので、\u30C6\u30B9\u30C8 という結果が返ってきています。escape-java の部分は [substitute, skip, stop, escape, escape-icu, escape-java, escape-c, escape-xml, escape-xml-hex, escape-xml-dec, escape-unicode] のどれかです。

で、こうやってなんとか情報劣化を救ったとしても、これをどうやって戻すかという問題が次は出てきます。戻す方法は ICU library 内部にあるはずだ、そしてそれは UConverter の近くにあるはずだ、と思ってました。callback は「困ったら呼ぶ」なので「戻らないかもな」と思う一方で、マニュアルの UCNV_ESCAPE_C の解説には TO_U_CALLBACK_ESCAPE という文字があるので「ひょっとして ucnv_toUChars() で機能するのか?」と思ったりしていました。

予想をガッチリ裏切られました。実はこれは UConverter を使ってはできません!

escape-java, escape-c の場合は u_unescape (ustring.h) でエスケープシーケンスを戻せます。

u_unescape の規則は次のとおり: ( http://icu-project.org/apiref/icu4c/ustring_8h.html#7aad56a2a6f7cbe3b2fb802a218d239b (new window) )
- \uhhhh の 4 hex digit 形式。h は [0-9A-Fa-f] の範囲
- \Uhhhhhhhh の 8 hex digit 形式。
- \xhh の 1-2 hex digit 形式。
- \x{h...} の 1-8 hex digit 形式。
- \ooo の 1-3 octal digit 形式。o は [0-7] の範囲。
- \cX の control-X 形式。X は 0x1F でマスクされた値。
- そして標準 ANSI C エスケープの形式。つまり \a, \b, \t, \n, \v, \f, \r, \e, \", \', \?, \\
- \ でエスケープされたものは、単にエスケープが解除される。

escape-java, escape-c を使う場合は、行きは ucnv_open("ISO8859-1",NULL) して、戻りは u_unescape() するのが良さそうです。
escape-xml, escape-xml-hex, escape-xml-dec については、XML に埋め込んでしまえば、XML パーサがデコードをやってくれるでしょう。
escape, escape-icu, escape-unicode は dump 以外の使い方がないような…。

プログラムで使う上では、結局 Java のほうがよく考えられていると思います。簡単な一例を挙げると「\uXXXX」という文字列自体を保存したい場合です。Java の native2ascii では \uuXXXX という形式に変換する一方で、ICU のやり方を通すと単に情報が失われます。
  • │2010-02-22 15:25:14│ カテゴリー:日記│ コメント(0) │ トラックバック(0)
  • 宛先 :
  • トラックバックURL:
  • この記事にトラックバックをする場合は、i-revoポータルサイトご利用上の注意を必ずご確認ください。
loading
loading
kwiさん
お友達人数:19人
spacer
spacer

© 2011 Internet Revolution