mbrlen
更新 : 2007 年 11 月
文字列のバイト数を特定します。必要に応じて、現在のロケールを使用してマルチバイト文字の途中から再開できます。
size_t mbrlen(
const char *str,
size_t maxSize,
mbstate_t mbstate
);
パラメータ
str
NULL で終わる文字列。maxSize
文字列の終端を示す NULL 文字を除いた文字列の最大長 (バイト数)。mbstate
変換のシフト状態。
戻り値
文字列の長さが maxSize 文字未満の場合、各関数は str の終端の NULL を除く文字数を返します。文字列が maxSize 文字を超える場合は、maxSize を返します。
0
次のカウント数以下のバイトが NULL ワイド文字を表すマルチバイト文字を形成する場合。> 0
次のカウント数以下のバイトが有効なマルチバイト文字を形成する場合、マルチバイト文字を形成するバイト数が返されます。-1
次のカウント数以下のバイトが完全なマルチバイトを形成せず、すべてのカウント バイトが処理された場合。-2
エンコード エラーが発生した場合は、次のカウント数以下のバイトが完全で有効なマルチバイト文字を形成しないため、errno 値は EILSEQ になり、変換状態はあいまいになります。
解説
mbrlen 関数は、str のマルチバイト文字シーケンスを構成するバイト数を特定し、マルチバイト文字の途中から再開することもでき、maxSize バイトまで調べます。mbstate_t の mbstate 引数は、シフト状態を追跡するために使用します。これが NULL の場合、mbrlen 関数は内部の静的 mbstate_t オブジェクトを使用します。これは次のコードと同じです。
mbrtowc(NULL, str, maxSize, mbstate)
mbstate が NULL の場合を除いて、mbrlen は内部の静的 mbstate_t オブジェクトを使用してシフト状態を追跡します。
mbrlen 関数は、再起動できるかどうかに関して、_mbclen、mblen、_mblen_l と異なります。変換状態は、同じまたは他の再起動可能な関数の後続の呼び出しのために mbstate に格納されます。再起動可能な関数と再起動不可能な関数を混在させた場合は、予測できない結果になる可能性があります。たとえば、その後に wcstombs. の代わりに wcsrtombs への呼び出しを使用するアプリケーションは、wcslen の代わりに wcsrlen を使用します。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
n/a |
n/a |
mbrlen |
n/a |
必要条件
ルーチン |
必須ヘッダー |
---|---|
mbrlen |
<wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_mbrlen.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
size_t Example(const char * pStr)
{
size_t charLen = 0;
size_t charCount = 0;
mbstate_t mbState;
memset(&mbState, 0, sizeof(mbState));
while ((charLen = mbrlen(pStr, MB_CUR_MAX, &mbState)) != 0 &&
charLen != (size_t)-1 && charLen != (size_t)-2)
{
pStr += charLen;
charCount++;
}
return (charCount);
}
int main( void )
{
size_t charCount = 0;
const char *pSample = "Every good boy does fine.";
charCount = Example(pSample);
printf("%s\nLength: %d\n", pSample, charCount);
}
Every good boy does fine.
Length: 25