- ベストアンサー
char型の文字数を数えるには
Unicode環境で char* str = "あ1い23"; のような場合、strの文字数を数えるには どうしたらいいでしょうか? この場合 5 を取得したいです。 お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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が入ります。
その他の回答 (1)
- jacta
- ベストアンサー率26% (845/3158)
> Unicode環境で というのが具体的にどういうことを意味しているのか分かりませんが、そのエンコーディングに対応したロケールに設定可能であるなら、 wchar_t wcs[N]; size_t n; setlocale(LC_CTYPE, "○○"); n = mbstowcs(wcs, str, N); とすることで、多バイト文字数が取得できます。 setlocaleに指定する文字列は処理系に依存しますので、マニュアルをよく読んでください。 もし使用しているエンコーディングを処理系で設定可能なロケールで対応できない場合は、自分で処理するか、ライブラリ(iconvとかICUとか)を使う必要があります。 なお、char型が16ビット以上の処理系であれば、そのままバイト数を数えれば文字数に一致するので簡単ですね。
お礼
ご回答ありがとうございます。 説明が曖昧でした。すいません。 Unicodeというのはこの場合、ソース内部が すべてUNICODEという意味です。 自分で処理するには具体的にどうしたらいいでしょうか? やりたいことは、シフトJISなどのマルチバイト文字ファイルを読んで、UNICODEに変換したいです。内部の処理がすべてUNICODEですので。 普通にWin32APIのReadFileでシフトJISファイルをwchar_tに読み込んでみたのですが、文字化けしてましたので、一旦charに読み込んでwchar_tに変換したいと思いました。 おかしいでしょうか?
補足
あ、ちょっと補足です。 変換するには、必要なサイズ分だけwchar_tのメモリ確保したいですが、文字数が分からず。。。
お礼
ご回答ありがとうございます。 実はずっとこれで試行錯誤してきましたが、 なぜか、freeのところでヒープエラーが起きて。。 単純なテストコードならうまく行くんですが、ファイルからとなると、 なぜかエラー。。 配列使えたら楽ですが、サイズが分からないもんで。。