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

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

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


mbrlen関数

概要

マルチバイト文字のバイト数を調べる。

ヘッダ

wchar.h

形式

size_t mbrlen(const char* restrict s, size_t n, mbstate_t* restrict 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[] = "日本語を使うテスト";

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

    mbstate_t mbstate = {0};

    int char_count = 0;
    for (int i = 0; str[i] != '\0'; ++i) {
        size_t 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);
}

実行結果:

length: 9

関連

再開可能な形ではないが、同じ役割を果たす mblen関数がある。

解説章


参考リンク


更新履歴

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

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

’2018/1/22 新規作成。



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

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

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

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る