C言語編 標準ライブラリのリファレンス mbrlen

先頭へ戻る

mbrlen関数

概要 マルチバイト文字のバイト数を調べる。
ヘッダ wchar.h
形式 size_t mbrlen(const char* s, size_t n, mbstate_t* ps);
引数 s 対象のマルチバイト文字を指すポインタ。
n 調べる最大バイト数。
ps 変換状態を管理する変数へのポインタ。またはヌルポインタ。
戻り値 引数s が指すバイト(引数 s がヌルポインタの場合は "")から、引数n で指定したバイト数だけを調べ、それがマルチバイト文字として有効なバイト列として完結していれば、マルチバイト文字を構成するバイト数を返す。有効なバイト列でなければ -1 を size_t型にキャストした値を返す。引数s がヌル文字('\0') を指している場合は 0 を返す。
引数n のバイト数分だけではマルチバイト文字として完結しない場合は、-2 を size_t型にキャストした値を返す。この場合、続きのバイトを調べれば有効なマルチバイト文字であるかもしれないし、そうではないかも知れない。
詳細 mbstate_t型の引数を持つことを除いて、mblen関数と同じである。mbstate_t型の引数は、変換状態を記憶するためにあり、例えば、マルチバイト文字を構成する途中のバイトで処理を止めても、その続きから処理を再開することが可能になっている。
バイト列がマルチバイト文字を構成しているものと考え、そのマルチバイト文字が必要としているバイト数を割り出す。調べる範囲は、引数 n で指定したバイト数分だけである。マルチバイト文字が必要とする可能性がある最大バイト数は、ロケールによって異なるので、MB_CUR_MAX の助けを借りることが多い、しかし、mbrlen関数の場合はそれより小さい値を指定し、その結果、マルチバイト文字を構成する途中のバイトで処理が中断されてしまっても、それまでの変換状態が記憶されるため、再開可能である。
引数s がヌルポインタの場合は、引数s として "" が、引数n として 1 が指定されたかのように動作する。
(size_t)-1 が返された場合には、errnoEILSEQ が設定される。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
    const char str[] = "日本語を使うテスト";
    mbstate_t mbstate = {0};
    int char_count;
    int i;
    size_t len;

    /* LC_CTYPE をネイティブロケールに変更 */
    if( setlocale( LC_CTYPE, "" ) == NULL ){
        fputs( "ロケールの設定に失敗しました。\n", stderr );
        exit( EXIT_FAILURE );
    }

    char_count = 0;
    for( i = 0; str[i] != '\0'; ++i ){
        len = mbrlen( &str[i], 1, &mbstate );

        if( len == (size_t)-1 ){
            /* 有効な文字列ではない */
            perror( "" );
            exit( EXIT_FAILURE );
        }
        if( len != (size_t)-2 ){
            /* マルチバイト文字を構成するバイト列の途中でないなら、
               1文字としてカウント */
            char_count++;
        }
    }

    printf( "length: %d\n", char_count );

    return 0;
}

実行結果:

length: 9
関連 C89 の時点では、再開可能な形ではないが、同じ役割を果たす mblen関数があった。
解説章


参考リンク

更新履歴

'2018/4/20 「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/11 全体的に文章を見直し修正。

'2018/1/22 新規作成。





標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS