次の方法で共有


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関数は、再起動可能性によって_mbclenmblen_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

関連項目

文字列操作
ロケール