Posted at

ICU のライブラリサイズを削減する方法

More than 5 years have passed since last update.

ICU とは Unicode 関連の処理をまとめたクロスプラットフォームでポータブルな、そして実績があり MITライセンス と組み込みにやさしいライブラリである。

ICU の変換や正規化などに使われるリソースデータは 20MB と大きく、再配布するアプリケーションには大きな足かせとなる。これを削減したい場合はどうすればよいだろうか?

答えは公式の FAQ にのっている。これに基づいて削減してみよう。

http://userguide.icu-project.org/icufaq#TOC-How-can-I-reduce-the-size-of-the-ICU-data-library-


1. ICU Data Customizer を使う

ICU Data Customizer は ICU で使われる変換テーブル、正規化ルールなどを必要に応じてカスタマイズし、データを生成してダウンロードできる便利なサービスである。

http://apps.icu-project.org/datacustom/

バージョン毎に異なるので、古い ICU のバージョンを使っている場合はそれに対応するものを使う必要がある。例えば ICU 49 なら以下を使う。

http://apps.icu-project.org/datacustom/ICUData49.html

デフォルトでは圧縮なしで約 20MB あることがわかる。ここでは ShiftJIS <=> UTF-8 の変換だけ行うというニーズをやってみる。


The estimated uncompressed size of this data library is 19195 KB


まず変換テーブル (Charset Mapping Tables) だけ残し、残りのチェックを外す。これだけでなんと約 25% になる。


The estimated uncompressed size of this data library is 4696 KB


つぎに一旦変換テーブルのチェックを外し、ShiftJIS 関連にチェックを入れる(もしかしたら ibm-943_P15A-2003 だけでよいかもしれない)。


  • ibm-942_P12A-1999.cnv

  • ibm-943_P130-1999.cnv

  • ibm-943_P15A-2003.cnv

  • ibm-5039_P11A-1998.cnv

すると 500KB 程になり、元の約 20MB に比べると約 40 倍の差が出た。これで "Get Data Library" ボタンをクリックするとダウンロードできるようになる。


The estimated uncompressed size of this data library is 503 KB


ちなみに一度ダウンロードすると 410 で再ダウンロードは出来ないので、再ダウンロードしたい場合はもう一回 "Get Data Library" で再生成しておく必要がある。また、UTF-8/UTF-16 はコアにバンドルされているため問題ない。


2. ファイルを置換してビルドする

その前に置換前の icudata ライブラリを確認してみよう。ダウンロードしてすぐ ../source/runConfigureICU MacOSX した場合はサイズは約 20MB あることがある。

-rwxr-xr-x  1 hkrn staff 20787296 libicudata.50.1.dylib

話に戻って入手したデータは ICU のソースコード中の icu/data/source/data/in/icudt[xx]l.dat ([xx] は ICU のバージョン) と置換し、もう一度ビルドする。そしてサイズを確認すると 520KB 程度になっていることがわかる。

-rwxr-xr-x  1 hkrn staff  520288 11 17 libicudata.50.1.dylib

文字コードを変換するだけなら通常 icuuc と先ほどの icudata のみでよく、必要に応じて icui18n をリンクする。前者の場合静的リンクしても 2MB 程度になり、小型化を図ることが出来る。