WideStudio Programming (2-4)~文字コード変換について

WideStudioのWSCstringにも文字コード変換の機能はあるのですが、タンゴレンではそちらではなく、ICU(International Components for Unicode)のコード変換ライブラリを使っています。ICUを使っているのは辞書順ソートを実現するためです。大は小を兼ねるとばかり、同じコンポーネントを使い倒しているわけです。開発の初期にはコード変換にはGNUのiconvライブラリを使っていましたが、同じ事をするライブラリを二種類使う必要は無いのでICUに統一しました。ICUにはC++のクラスをベースにしたライブラリと、Cの関数によるプリミティブなルーチンの二種類がありますが、タンゴレンではCベースの方を使っています。

Windows版タンゴレンで使っている文字コードは、shift-jis(cp932)とutf-8/utf-16です。WideStudioの画面ライブラリとのやり取りやログファイルへの出力はutf-8、単語帳ファイルへのデータ格納や単語データの文字列処理はutf-16ベースで行なわれます。

開発初期の方針では単語データの格納と文字列処理は(サロゲートペアの処理を嫌って)utf-32を使う予定で、実際ある程度までそのように実装していたのですが、ICUを使うことにした時点で、そちらのライブラリがutf-16をベースにしているので、それに合わせました。

また、便宜上shift-jisと書いていますが、内部のコード変換関数に与えるコード名は”SHIFTJIS”ではなく”CP932″(コードページ932番)と指定しないと、色々と変なことが起きます。この辺はよく知られている話のようですが、当初はなんでこうなるんだろう(例えば、パス区切りの”\”が”¥”になってるとか)と随分悩みました。ファイル操作をutf-16系の関数/APIで行なうようにしたのは、この辺の不確実性を排除するためでもあります。

実際に使っている関数はごく一部なのでちょっと整理した方がよいような気もしているのですが、この先公開予定のソースを読む際に時々現われますので、タンゴレンで使っている文字コード変換ライブラリのソースを http://www.attocraft.jp/contents/archive/alsyscharset.zip に置いておきます。たぶん変換操作自体は関数名から自明ではないかと思います。(補足:ALSysCharSet.hpp がトップレベルのクラスで、残りのクラスは下請けの部品です。iconvを使った実装も含まれていますが、タンゴレンではICUの方が使われています)