Namespaces
Variants

std:: c32rtomb

From cppreference.net
헤더 파일에 정의됨 <cuchar>
std:: size_t c32rtomb ( char * s, char32_t c32, std:: mbstate_t * ps ) ;
(C++11부터)

UTF-32 문자를 좁은 멀티바이트 표현으로 변환합니다.

만약 s 가 null 포인터가 아니라면, 이 함수는 c32 의 멀티바이트 문자 표현을 저장하는 데 필요한 바이트 수를 결정하고(현재 멀티바이트 변환 상태 * ps 를 고려하여 시퀀스 전환 포함), 멀티바이트 문자 표현을 s 가 가리키는 첫 번째 요소를 시작으로 하는 문자 배열에 저장하며, 필요에 따라 * ps 를 갱신합니다. 이 함수는 최대 MB_CUR_MAX 바이트까지 쓸 수 있습니다.

만약 s 가 null 포인터라면, 이 호출은 내부 버퍼 buf 에 대해 std :: c32rtomb ( buf, U ' \0 ' , ps ) 와 동일합니다.

만약 c32 가 null 와이드 문자 U ' \0 ' 라면, null 바이트가 저장되며, 초기 shift 상태를 복원하는 데 필요한 shift sequence가 앞에 추가되고 변환 상태 매개변수 * ps 는 초기 shift 상태를 나타내도록 업데이트됩니다.

이 함수가 사용하는 멀티바이트 인코딩은 현재 활성화된 C 로캘에 의해 지정됩니다.

목차

매개변수

s - 멀티바이트 문자가 저장될 narrow 문자 배열에 대한 포인터
c32 - 변환할 32비트 문자
ps - 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터

반환값

성공 시, s 가 가리키는 첫 번째 요소를 갖는 문자 배열에 기록된 바이트 수(시프트 시퀀스 포함)를 반환합니다. 이 값은 0 일 수 있으며, 예를 들어 다중 char32_t 문자 시퀀스에서 첫 번째 char32_t 를 처리할 때 발생합니다(UTF-32에서는 발생하지 않음).

실패 시 ( c32 가 유효한 32비트 문자가 아닌 경우), - 1 를 반환하고, EILSEQ errno 에 저장하며, * ps 는 지정되지 않은 상태로 둡니다.

예제

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u32string_view strv = U"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-32 code units: [ ";
    for (char32_t c : strv)
        std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';
    std::cout << "]\n";
    std::mbstate_t state{};
    char out[MB_LEN_MAX]{};
    for (char32_t c : strv)
    {
        std::size_t rc = std::c32rtomb(out, c, &state);
        std::cout << static_cast<int>(c) << " converted to [ ";
        if (rc != (std::size_t) - 1)
            for (unsigned char c8 : std::string_view{out, rc})
                std::cout << +c8 << ' ';
        std::cout << "]\n";
    }
}

출력:

Processing 4 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0x1f34c converted to [ 0xf0 0x9f 0x8d 0x8c ]

참고 항목

(C++11)
좁은 멀티바이트 문자를 UTF-32 인코딩으로 변환
(함수)
[virtual]
문자열을 InternT 에서 ExternT 로 변환 (예: 파일에 기록할 때)
( std::codecvt<InternT,ExternT,StateT> 의 가상 protected 멤버 함수)
C documentation for c32rtomb