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
_mbclen
mblen
_mblen_l
다시 시작할 수 있는 기능과 다릅니다. 같거나 다른 다시 시작 가능 함수에 대한 후속 호출에서는 이동 상태가 mbstate
에 저장됩니다. 다시 시작할 수 있는 함수와 다시 시작할 수 없는 함수를 함께 사용할 때는 결과가 정의되지 않습니다. 예를 들어 wcsrlen
대신 후속 wcslen
호출을 사용하는 경우 애플리케이션은 wcsrtombs
대신 wcstombs
을 사용해야 합니다.
기본적으로 이 함수의 전역 상태는 애플리케이션으로 범위가 지정됩니다. 이 동작을 변경하려면 CRT 전역 상태를 참조하세요.
일반 텍스트 루틴 매핑
TCHAR.H 루틴 | _UNICODE 및 _MBCS 정의되지 않음 |
정의된 _MBCS |
정의된 _UNICODE |
---|---|---|---|
적용할 수 없음 | 적용할 수 없음 | mbrlen |
적용할 수 없음 |
요구 사항
루틴에서 반환된 값 | 필수 헤더 |
---|---|
mbrlen |
<wchar.h> |
호환성에 대한 자세한 내용은 호환성을 참조하세요.
예시
이 예제에서는 멀티바이트 문자 해석이 현재 코드 페이지에 따라 달라지는 방식과 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