Namespaces
Variants

mblen

From cppreference.net
헤더 파일에 정의됨 <stdlib.h>
int mblen ( const char * s, size_t n ) ;

s 가 가리키는 첫 번째 바이트부터 시작하는 멀티바이트 문자의 크기를 바이트 단위로 결정합니다.

만약 s 가 null 포인터라면, 전역 변환 상태를 재설정하고 (C23까지) 시프트 시퀀스 사용 여부를 결정합니다.

이 함수는 mbtowc ( ( wchar_t * ) 0 , s, n ) 호출과 동등하지만, mbtowc 의 변환 상태가 영향을 받지 않는다는 점이 다릅니다.

목차

매개변수

s - 멀티바이트 문자에 대한 포인터
n - 검사 가능한 s 내 바이트 수의 제한

반환값

만약 s 가 null 포인터가 아니라면, 멀티바이트 문자에 포함된 바이트 수를 반환하거나 - 1 를 반환합니다( s 가 가리키는 첫 번째 바이트들이 유효한 멀티바이트 문자를 형성하지 않는 경우) 또는 0 를 반환합니다( s 가 null 문자 ' \0 ' 를 가리키는 경우).

만약 s 가 널 포인터라면, 내부 변환 상태를 초기 시프트 상태를 나타내도록 재설정하고 (C23까지) 현재 멀티바이트 인코딩이 상태 비의존적(시퀀스 시프트를 사용하지 않음)인 경우 0 을 반환하며, 현재 멀티바이트 인코딩이 상태 의존적(시퀀스 시프트를 사용함)인 경우 0이 아닌 값을 반환합니다.

참고 사항

mblen 에 대한 각 호출은 내부 전역 변환 상태(이 함수만이 알고 있는 mbstate_t 타입의 정적 객체)를 갱신합니다. 멀티바이트 인코딩이 시프트 상태를 사용하는 경우, 역추적이나 다중 스캔을 피하기 위해 주의해야 합니다. 어떤 경우든 여러 스레드가 동기화 없이 mblen 을 호출해서는 안 됩니다: 대신 mbrlen 을 사용할 수 있습니다.

(C23까지)

mblen 은 내부 상태를 가질 수 없습니다.

(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("문자열 \"%s\"는 %zu개의 문자로 구성되었지만 %zu바이트입니다: ",
            str, strlen_mb(str), strlen(str));
    dump_bytes(str);
}

가능한 출력:

문자열 "zß水🍌"는 4개의 문자로 구성되었지만 10바이트입니다: 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 함수

참고 항목

다음 멀티바이트 문자를 와이드 문자로 변환
(함수)
(C95)
상태를 고려하여 다음 멀티바이트 문자의 바이트 수를 반환
(함수)