- ベストアンサー
文字数を取得したい
漢字を含んだ文字列の文字数を取得したのですがうまくいきません。 どなたか教えてください。 例: 「asetg漢字」という文字列だったら、7文字として取得したい。 上記の例で、lstrlenや、MFCの関数(String)で文字数の取得を試みたのですが、バイト数で取得してしまうため、うまくいきませんでした。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
mbstrlen()ですか...これは便利そう!でも私の環境(VC6)にはありませんでした。残念。 私は1文字ずつループして数えています。漢字なら2byteで1文字とカウントする方法です。漢字かどうかは以下の関数でチェックしています。 // 漢字の1バイト目なら true bool IsSJIS_Kanji(BYTE ch) { return (_ismbblead((UINT)ch) != 0) ? true : false; // 0x81~0x9F || 0xE0~0xFC }
その他の回答 (3)
- oeuvre
- ベストアンサー率0% (0/1)
>また、漢字等マルチバイトの一文字目かどうかの判定には、isleadbyteも使えます。 ごめんなさい。 一文字目かどうかではなくて、マルチバイト文字の最初のバイトかどうか、です。 失礼しました。
- oeuvre
- ベストアンサー率0% (0/1)
もしVCをお使いでしたら、_mbstrlenはどうでしょうか。 //_mbstrlenはlocaleに依存するため次の呼び出しが必要 setlocale(LC_ALL, "japanese"); int length = _mbstrlen("asetg漢字"); また、漢字等マルチバイトの一文字目かどうかの判定には、isleadbyteも使えます。 VCにおいて_mbstrlenの実装に使われています。 ANSI規格に含まれているので、_mbstrlenに相当するものがない環境で役に立つかもしれません。
- bugmaru
- ベストアンサー率38% (76/195)
strlen()と文字列中のマルチバイト文字数を返すmbstrlen()の二つを使って 導き出します。 lLen = strLen(str) mb = mbstrlen(str) sb = llen - mb * 2 Mojisu = sb + mb 頻繁に使うなら関数化してしまうと良いのではないでしょうか。
お礼
ありがとうございます。 カウントすることが出来ました。