2010-10-30-01-文字コードの話 - 7 - project-enigma

2010-10-30-01-文字コードの話 - 7

>> Site top >> weblog >> 月別アーカイブ >> 2010年10月のlog >> 2010-10-30-01-文字コードの話 - 7

最終更新日付:2013/12/31 07:35:54


文字コードの話 - 7

2010 年 10 月 30 日

前回の最後で、エンコーディングの自動判別と変換について、まだないが欲しい機能だと書いた。それから今日までの間に、少しだけ着手してしまった。

自動判別にしても変換にしても、ともに探せば既存の実装が手に入る。そもそも、各種エンコーディングの取り扱いだって同じことだ。このような、すでに実装が存在するソフトウェアを別途作ることについて、「車輪の再発明」みたいな表現で無駄だと指摘するのをみかけたことがある。個人的な意見としては、ソフトウェアは車輪ではないし、車輪になぞらえるのであれば、自分で作成することは再「発明」ではなく、単純に自分の目的にぴったり合致するような車輪を作っているだけのことだ。そして自分にとっては、ソフトウェアは盆栽のようなものだ。出来合いのものを買ってくることもできるが、自分で時間をかけ、工夫をこらして作り上げることに(も)重要な価値がある。

話を戻そう。自動判別については、単純な関数として実装することにした。Encoding::Detect( const char*, int ) だ。判別対象文字列の先頭を指すポインタとバイト長を渡すことで、エンコーディングを示す列挙値を返す。実装はまだ空っぽだが、一般に解説されている判別方法を参考にして、おそらくはスコアリングのような方法で判別をする実装になるだろう。今後が楽しみだ。

変換については、以下のような関数テンプレートをヘッダに用意し、実装は明示的特殊化をインプレファイルに書く方法をとった。こうすれば、ひとまずサポートしない変換はリンカエラーで落とすことができる。

template <typename ENC1, typename ENC2>
bool Convert( const char* pData, int length, 
              char* pBuf, const ENC1& from, const ENC2& dest );

ちなみに、復帰値の bool にはどのような意味があるか? これは、変換不可能な文字が含まれていた場合を知らせるものだ。

ところで、上記で ENC1 と ENC2 が同じだった場合はどうするか? 変換の必要がないのだから、単純にコピーすれば良い。そのため、以下のテンプレートを別途用意している。これはヘッダにおいておけば良い。

template <typename ENC>
bool Convert( const char* pData, int length, 
              char* pBuf, const ENC& from, const ENC& dest ) {
    dest.StrNCpy( pBuf, pData, length );
    dest.PlaceChar( pBuf + length, 0 );
    return true;
};

こんなところだろうか。変換については、なにも考えなくても実装できるようなものは実装し、面倒なものについては時間をかけて育てていくことにした。

さて、文字コードの話はもうこれくらいにしよう。まだ不完全だが、すでにこの仕組みは自作の他のプログラムで使用し、自分のニーズを満たす程度にはきちんと動いてくれている。自分のニーズが変化しない限り、手を入れることはないかもしれないが、それでも長い付き合いになりそうではある。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.