ICUとは
ICUはInternational Components for Unicodeの略で、その名の通りUnicodeに関するあれこれを扱ってくれるライブラリです。
TATEditorで利用しているICUの機能はざっと以下の通りです。
- 正規表現検索 (regular expressions)
- Unicode的にはUTS#18の実装になります
- Level 1とLevel 2の一部を実装している
- 使う場合はこちら側のテキストをUTF-16で持っておくと便利
-
UText
を実装すればかなり自由度の高い文字列クラスを使えます
-
- Unicode的にはUTS#18の実装になります
- 曖昧検索 (collation)
- 使う場合はこちら側のテキストをUTF-16で持っておくと便利
-
UCharIterator
を実装すればかなり自由度の高い文字列クラスを使えます
-
- 使う場合はこちら側のテキストをUTF-16で持っておくと便利
- 文字種の変換
- Hiragana to Latin, Any to Upper, Any to NFCなどの変換ができます
- 文字列境界の解析
- 改行可能な位置の取得
- Unicode的にはUAX#14の実装
- TATEditorでは折り返し改行を行う場所の探索に利用しています
- 単語の区切りの取得
- Unicode的にはUAX#29 (Word Boundaries)の実装
- TATEditorではダブルクリック時の選択範囲の決定に利用しています
- 文章の区切りの取得
- Unicode的にはUAX#29 (Sentence Boundaries)の実装
- TATEditorではトリプルクリック時の選択範囲の決定に利用しています
- 改行可能な位置の取得
- Unicode情報の取得
- Unicodeの種々の値を取得できます
- TATEditorでは文字のUnicode名を表示する際に使っています
- ステータスバーのコードポイントを右クリックすると出る
- 文字コード検出
- 実装はメジャーな文字コード全てに対して評価関数(バイナリ ↦ [0,100])を設計し、その評価値の最も高いものを選ぶというもの
- それなりの精度
- 文字コード変換
- UTF-16 ⇄ 各種文字コードの変換ができる
- 変換元/変換先の文字コード名を知っている必要がある
- 一覧はここで見られます
- 日付/時刻の文字列化
- 時刻を各Localeの表記に変換するものです
- 昔はWindows 7以前で日本のタイムゾーンの取得に失敗して韓国標準時になったりしてた
- 直ったという噂を聞いている
- 昔は https://twitter.com/496_/status/104628456599470080 みたいな感じで修正してました
- TATEditorでは現在時刻の挿入などに使っています
- F5キーで挿入できる
他にもBiDiのAPIやレイアウトエンジンがあります。
BiDiはアラビア語などに対応する際にお世話になるかなと思ってます。
ICUのビルド
- Windows
- Visual Studioのソリューションファイルをビルドすれば完成です
- スタティックライブラリのビルドはちょっと骨が折れます
- (適切な手順を書く時間がなかった)
- Ubuntu
- macOS
- 適切な引数で
./runConfigureICU
すればいい感じになる - macOSでUniversalバイナリを作るなら
lipo
しましょう
- 適切な引数で
- iOS
- Android
- https://github.com/zhuxiaomengjj/icu-cross-compile が良さそう
- 適当に修正して使いましょう
ICUのサンプルコード(NULL
)
時間が足りませんでした><。
おわりに
ICUはUnicodeの仕様を実装する手間を省く際には非常に便利なライブラリでした。
本当は「ICUの使い方」というタイトルだったのですが、使い方(サンプルコード)に手がつかなかったので変更しました。
明日はwxWidgetsのことを書きます。