mblen
|
ヘッダーで定義
<stdlib.h>
|
||
|
int
mblen
(
const
char
*
s,
size_t
n
)
;
|
||
最初のバイトが
s
によって指されるマルチバイト文字のサイズをバイト単位で決定します。
s
がヌルポインタの場合、
グローバル変換状態をリセットし、
(until C23)
シフトシーケンスが使用されるかどうかを決定します。
この関数は、 mbtowc ( ( wchar_t * ) 0 , s, n ) の呼び出しと等価ですが、 mbtowc の変換状態が影響を受けない点が異なります。
目次 |
パラメータ
| s | - | マルチバイト文字へのポインタ |
| n | - | sで検査可能なバイト数の上限 |
戻り値
s
がnullポインタでない場合、マルチバイト文字に含まれるバイト数を返す。または
-
1
を返す(
s
が指す先頭バイト列が有効なマルチバイト文字を形成しない場合)。または
0
を返す(
s
がナル文字
'
\0
'
を指している場合)。
s
がヌルポインタの場合、
内部変換状態を初期シフト状態にリセットし、
(C23まで)
現在のマルチバイトエンコーディングが状態依存でない場合(シフトシーケンスを使用しない)は
0
を返し、現在のマルチバイトエンコーディングが状態依存の場合(シフトシーケンスを使用する)は非ゼロの値を返す。
注記
|
|
(C23まで) |
|
|
(C23以降) |
例
#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> // マルチバイト文字列の文字数は mblen() の合計値 // 注意: より簡潔な方法は mbstowcs(NULL, str, sz) size_t strlen_mb(const char* ptr) { size_t result = 0; const char* end = ptr + strlen(ptr); mblen(NULL, 0); // 変換状態をリセット while(ptr < end) { int next = mblen(ptr, end - ptr); if (next == -1) { perror("strlen_mb"); break; } ptr += next; ++result; } return result; } void dump_bytes(const char* str) { for (const char* end = str + strlen(str); str != end; ++str) printf("%02X ", (unsigned char)str[0]); printf("\n"); } int main(void) { setlocale(LC_ALL, "en_US.utf8"); const char* str = "z\u00df\u6c34\U0001f34c"; printf("The string \"%s\" consists of %zu characters, but %zu bytes: ", str, strlen_mb(str), strlen(str)); dump_bytes(str); }
出力例:
The string "zß水🍌" consists of 4 characters, but 10 bytes: 7A C3 9F E6 B0 B4 F0 9F 8D 8C
参考文献
- C17規格 (ISO/IEC 9899:2018):
-
- 7.22.7.1 mblen関数 (p: 260)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.22.7.1 mblen関数 (p: 357)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.20.7.1 mblen関数 (p: 321)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.10.7.1 mblen関数
関連項目
|
次のマルチバイト文字をワイド文字に変換する
(function) |
|
|
(C95)
|
状態を指定して、次のマルチバイト文字のバイト数を返す
(function) |
|
C++ documentation
for
mblen
|
|