|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
|
| 今回は多バイト文字からワイド文字に変換するためのmbtowc関数です。mbtowc関数はmblen関数とほとんど変わりません。実際、mblen関数は、
mbtowc(NULL, s, n)
と等価だからです。つまり、mbtowc関数とmblen関数の違いは、変換結果を格納するかどうかの違いでしかありません。それでは実装です。
#include <stddef.h>
int mbtowc(wchar_t *pwc, const char *s, size_t n) { if (s == NULL || *s == '\0' || n == 0) return 0; if (pwc != NULL) *pwc = (unsigned char)*s; return 1; }
現時点では、"C"ロケールにしか対応しない方針ですので、多バイト文字をそのままワイド文字に置き換えています。ここで、(unsigned char)でキャストしているのは、値を0~UCHAR_MAXにするためです。すなわち、0x80~0xffの範囲の値に対する対策です。
| 2006/06/14 15:37|一般ユーティリティ|TB:0|CM:3|▲
|
|
コメント
|
私もよくわからないんで参考にと思ったのですが、これは酷い。いや失礼。 シフトするとかいってもEUCやSJIS、UNICODEなどなどエンコードの種類も種々雑多なわけで、どうやって認識しているのか気になるところですね。
|
通りすがりの野良猫さん #-|2007/09/09(日) 03:54 [ 編集 ]
|
本文中にも書いているように、「"C"ロケール」にしか対応していません。ですので、EUCとかSJISとかUnicodeはすべて未対応です。
実際のところ、ここで扱っているようなローエンドの環境では、多くのロケールに対応させることは現実的ではありません。せいぜい、"C"ロケールともう一つぐらいでしょう。 もっと言えば、標準ライブラリにロケールの切り替え機能を入れると、isalphaのようなロケール依存の機能が欲しいわけでもない関数まで、それによるオーバーヘッドが発生します。その意味では、多バイト文字に対応するのは、標準ライブラリ外で専用のライブラリを用意する方がよいことも多いでしょう。
|
たかぎ #ftr86F3A|2007/09/09(日) 15:38 [ 編集 ]
|
はじめての投稿でずいぶん失礼なことを書いていましたね。反省です。 いろいろ調べてみましたが、仰る通り文字コード変換関数を自作したりベンダ提供関数を利用するのが普通なようですね。やっぱり内部的にはUTF-16あたりで日本語を処理して必要に応じてそれぞれの文字コードに変換を掛けるのがいいのかなと思っています。まんまWindowsと同じ発想ですが…。本当はもっと完全な形で日本語を処理できる内部構造、例えば32ビットで1文字を保持するとか、できたらと思いました。割り切って16ビットでっていうことならワイド文字系関数も利用価値がありそうですね。
|
通りすがりの野良猫さん #-|2007/09/15(土) 14:50 [ 編集 ]
|
コメントの投稿
|
|
|
トラックバック
|
トラックバックURLはこちら
http://libc.blog47.fc2.com/tb.php/70-a8b9e1f2
|
|
|
ホーム
全記事一覧
<< 前の記事
次の記事 >>
|
| | |
|
|