libiconv で文字セット自動認識
ご無沙汰ぶりです…。
以前、wchar_t はどうにも使い物にならないからどうしよう、といった記事を書いたのですが、その続きのお話です。
表題の通りで、 libiconv を用いて文字セットを自動認識する処理のサンプルを書いてみました。詳しい経緯はTicket 内で逐次コメントしています。
これがそのサンプルプログラムです。このプログラムは、
- 標準入力からファイルを読み込み、
- ファイルの文字セットを自動認識し、
- 句点「。」をピリオド「.」に、読点「、」をカンマ「,」に置換し、
- UTF-8 に変換して標準出力に書き出す。
ということをやるものです。
で、以前のブログ記事では、
というわけで、内部コードは wchar_t のような型名で定義するのではなく、より具体的に文字セットで定義した方が良さそうだなぁという結論に至りました。候補は以下の 2通りです。
- UCS4 を内部コードとし、物理型は符号無し 32bits 整数を適当な型名に typedef して用いる。
- UTF-8 を内部コードとし、物理型は char を用いる。
と書いておりましたが、今回はこのうち、前者の UCS4 を内部コードとして用いる方法で実装しています。
とりあえず動いたから commit してみた、という段階なので、コメントが不十分だったり魔法の値が散らばっていたりと未熟なコードです。追々直していこうかと思っています。また、後者の UTF-8 を内部コードとして用いる方法についても併せて書いてみる予定です。
また、現状では boost::regex を用いたコードにはなっていないので (1文字ずつの置換なので UCS4 だと使う必要がないのよ、今のところ)、これを用いた形に修正した場合、どうなるか、といった辺りも試していきたいと思っています。実際にコードに起こしてみると、頭で分かっている以上の利点や問題点が分かってくるんじゃないかなと。
2010 年 3 月 3 日 by 村山 俊之