プロが教えるわが家の防犯対策術!

Unicode環境で
char* str = "あ1い23";
のような場合、strの文字数を数えるには
どうしたらいいでしょうか?
この場合 5 を取得したいです。
お願いします。

A 回答 (2件)

> Unicode環境で



というのが具体的にどういうことを意味しているのか分かりませんが、そのエンコーディングに対応したロケールに設定可能であるなら、

wchar_t wcs[N];
size_t n;

setlocale(LC_CTYPE, "○○");
n = mbstowcs(wcs, str, N);

とすることで、多バイト文字数が取得できます。
setlocaleに指定する文字列は処理系に依存しますので、マニュアルをよく読んでください。

もし使用しているエンコーディングを処理系で設定可能なロケールで対応できない場合は、自分で処理するか、ライブラリ(iconvとかICUとか)を使う必要があります。

なお、char型が16ビット以上の処理系であれば、そのままバイト数を数えれば文字数に一致するので簡単ですね。

この回答への補足

あ、ちょっと補足です。

変換するには、必要なサイズ分だけwchar_tのメモリ確保したいですが、文字数が分からず。。。

補足日時:2005/09/24 20:26
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

説明が曖昧でした。すいません。
Unicodeというのはこの場合、ソース内部が
すべてUNICODEという意味です。

自分で処理するには具体的にどうしたらいいでしょうか?

やりたいことは、シフトJISなどのマルチバイト文字ファイルを読んで、UNICODEに変換したいです。内部の処理がすべてUNICODEですので。

普通にWin32APIのReadFileでシフトJISファイルをwchar_tに読み込んでみたのですが、文字化けしてましたので、一旦charに読み込んでwchar_tに変換したいと思いました。
おかしいでしょうか?

お礼日時:2005/09/24 20:26

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1638451
で回答したものです。

http://www.doumo.jp/postgretips/tips.jsp?tips=67
にあるように
逆のAPIも存在します。

wchar_t *wbuf2;
char buf2[] = "あ1い23";
int buflen = MultiByteToWideChar(CP_ACP,0,buf2,-1,NULL,0);
wbuf2 = (wchar_t*)malloc(buflen * sizeof(wchar_t));
MultiByteToWideChar(CP_ACP,0,buf2,-1,wbuf2,buflen);
int answer = lstrlenW(wbuf2);
free(wbuf2);


answer に5が入ります。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

実はずっとこれで試行錯誤してきましたが、
なぜか、freeのところでヒープエラーが起きて。。
単純なテストコードならうまく行くんですが、ファイルからとなると、
なぜかエラー。。
配列使えたら楽ですが、サイズが分からないもんで。。

お礼日時:2005/09/24 21:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!