mbrlen
現在のロケールのマルチバイト文字を完成させるのに必要なバイト数を決定します。マルチバイト文字の途中から再開することが可能です。
構文
size_t mbrlen(
const char * str,
size_t count,
mbstate_t * mbstate
);
パラメーター
str
マルチバイト文字列内の検査対象となる次のバイトへのポインター。
count
検査対象の最大バイト数。
mbstate
str
の最初のバイトの現在のシフト状態へのポインター。
戻り値
次のいずれかの値です。
値 | 説明 |
---|---|
0 | 次の count 以下のバイトで、ワイド null 文字を表すマルチバイト文字が完成します。 |
1 ~ count (両端を含む) |
次の count 以下のバイトで、有効なマルチバイト文字が完成します。 返される値は、マルチバイト文字を完成するのに必要なバイト数です。 |
(size_t)(-2) | 次の count バイトは、不完全ながら有効になり得るマルチバイト文字に寄与し、すべての count バイトが処理されています。 |
(size_t)(-1) | エンコーディング エラーが発生しました。 次の count 以下のバイトは、完全で有効なマルチバイト文字には影響しません。 この場合、 errno が EILSEQ に設定され、mbstate の変換状態は指定されていません。 |
解説
mbrlen
関数は、count
がポイントするバイトで始まる最大 str
バイトを検査して、シフト シーケンスを含む次のマルチバイト文字を完成させるのに必要なバイト数を判別します。 これは、mbstate
がユーザー指定のmbstate_t
オブジェクトか、ライブラリによって提供される静的内部オブジェクトである呼び出しmbrtowc(NULL, str, count, &mbstate)
と同じです。
mbrlen
関数は、mbstate
パラメーターの不完全なマルチバイト文字のシフト状態を格納して使用します。 必要に応じて**mbrlen
**がマルチバイト文字の途中で再起動し、最大 count
バイトを調べるのはそのためです。 mbstate
が null ポインターの場合、mbrlen
は内部の静的な mbstate_t
オブジェクトを使用してシフト状態を格納します。 内部 mbstate_t
オブジェクトはスレッド セーフではないので、常に独自の mbstate
パラメーターを割り当てて渡すことをお勧めします。
mbrlen
関数は、再起動可能性によって_mbclen
、mblen
、_mblen_l
とは異なります。 同じ関数または再開可能な他の関数の後続の呼び出しのために、シフト状態が mbstate
に格納されます。 再開可能な関数と再開不可能な関数を混用した場合、結果は未定義です。 たとえば、wcsrlen
の代わりに wcslen
の後続の呼び出しが使用されている場合、アプリケーションは wcsrtombs
の代わりに wcstombs
を使用する必要があります。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン | _UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
適用外 | 適用外 | mbrlen |
適用外 |
要件
ルーチンによって返される値 | 必須ヘッダー |
---|---|
mbrlen |
<wchar.h> |
互換性の詳細については、「 Compatibility」を参照してください。
例
この例は、マルチバイト文字の解釈が現在のコード ページによってどのように異なるかを示し、mbrlen
の再開機能の例を示します。
// crt_mbrlen.c
// Compile by using: cl crt_mbrlen.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
size_t Example(const char * pStr)
{
size_t charLen = 0;
size_t charCount = 0;
mbstate_t mbState = {0};
while ((charLen = mbrlen(pStr++, 1, &mbState)) != 0 &&
charLen != (size_t)-1)
{
if (charLen != (size_t)-2) // if complete mbcs char,
{
charCount++;
}
}
return (charCount);
}
int main( void )
{
int cp;
size_t charCount = 0;
const char *pSample =
"\x82\xD0\x82\xE7\x82\xAA\x82\xC8: Shift-jis hiragana.";
cp = _getmbcp();
charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);
setlocale(LC_ALL, "ja-JP"); // Set Japanese locale
_setmbcp(932); // and Japanese multibyte code page
cp = _getmbcp();
charCount = Example(pSample);
printf("\nCode page: %d\n%s\nCharacter count: %d\n",
cp, pSample, charCount);
}
Code page: 0
é╨éτé¬é╚: Shift-jis hiragana.
Character count: 29
Code page: 932
????: Shift-jis hiragana.
Character count: 25