C99に対応した標準Cライブラリの実装レポートを行っていきます。

プロフィール 

高木信尚

Author:高木信尚

ホームページ
ブログ

最近の記事 

最近のコメント 

最近のトラックバック 

月別アーカイブ 

カテゴリー 

ブロとも申請フォーム 

この人とブロともになる

ホーム 全記事一覧 << 前の記事 次の記事 >>

 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- --:--|スポンサー広告

 

今回は多バイト文字からワイド文字に変換するための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:0CM:3

コメント
ワイド文字
私もよくわからないんで参考にと思ったのですが、これは酷い。いや失礼。
シフトするとかいってもEUCやSJIS、UNICODEなどなどエンコードの種類も種々雑多なわけで、どうやって認識しているのか気になるところですね。
通りすがりの野良猫さん #-|2007/09/09(日) 03:54 [ 編集 ]

「"C"ロケール」以外は未対応です。
本文中にも書いているように、「"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

ホーム 全記事一覧 << 前の記事 次の記事 >>

ブログ内検索 

お勧め書籍 

RSSフィード 

リンク 

このブログをリンクに追加する

Copyright(C) 2006 TAKAGI Nobuhisa All rights reserved.
Powered by FC2ブログ. template designed by 遥かなるわらしべ長者への挑戦.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。