std:: c16rtomb
|
헤더 파일에 정의됨
<cuchar>
|
||
|
std::
size_t
c16rtomb
(
char
*
s,
char16_t
c16,
std::
mbstate_t
*
ps
)
;
|
(C++11 이후) | |
가변 길이 16비트 문자 표현(일반적으로 UTF-16)에서 단일 코드 포인트를 좁은 멀티바이트 문자 표현으로 변환합니다.
만약 s 가 null 포인터가 아니고 c16 가 유효한 가변 길이 인코딩의 마지막 16비트 코드 유닛인 경우, 이 함수는 해당 코드 포인트의 멀티바이트 문자 표현을 저장하는 데 필요한 바이트 수를 결정하고(시프트 시퀀스를 포함하며 현재 멀티바이트 변환 상태 * ps 를 고려하여), 그 멀티바이트 문자 표현을 s 가 가리키는 첫 번째 요소를 시작으로 하는 문자 배열에 저장하며, 필요한 경우 * ps 를 업데이트합니다. 이 함수로 최대 MB_CUR_MAX 바이트까지 기록할 수 있습니다.
만약
s
가 null 포인터인 경우, 이 호출은 내부 버퍼
buf
에 대해
std
::
c16rtomb
(
buf, u
'
\0
'
, ps
)
와 동일합니다.
만약 c16 이 와이드 문자(wchar)의 16비트 표현에서 최종 코드 유닛이 아닌 경우, s 가 가리키는 배열에는 기록되지 않고, * ps 만 업데이트됩니다.
만약 c16 가 null 와이드 문자 u ' \0 ' 라면, null 바이트가 저장되며, 초기 shift 상태를 복원하는 데 필요한 shift sequence가 앞에 추가되고 변환 상태 매개변수 * ps 는 초기 shift 상태를 나타내도록 업데이트됩니다.
이 함수가 사용하는 멀티바이트 인코딩은 현재 활성화된 C 로캘에 의해 지정됩니다.
목차 |
매개변수
| s | - | 멀티바이트 문자가 저장될 narrow 문자 배열에 대한 포인터 |
| c16 | - | 변환할 16비트 문자 |
| ps | - | 멀티바이트 문자열을 해석할 때 사용되는 변환 상태 객체에 대한 포인터 |
반환값
성공 시, s 가 가리키는 첫 번째 요소를 시작으로 하는 문자 배열에 기록된 바이트 수(시프트 시퀀스를 포함)를 반환합니다. 이 값은 0 일 수 있습니다(예: 서로게이트 페어의 첫 번째 char16_t 를 처리할 때).
실패 시 ( c16 이 유효한 16비트 문자가 아닌 경우), - 1 를 반환하고, EILSEQ 를 errno 에 저장하며, * ps 는 지정되지 않은 상태로 둡니다.
참고 사항
C++ 표준은 이 함수의 의미론에 대해 C 표준을 따릅니다. 게시된 C11에서는, std::mbrtoc16 이 가변 너비 멀티바이트(예: UTF-8)를 가변 너비 16비트(예: UTF-16) 인코딩으로 변환하는 것과 달리, 이 함수는 단일 유닛 16비트 인코딩만 변환할 수 있습니다. 즉, 이 함수의 원래 의도에도 불구하고 UTF-16을 UTF-8로 변환할 수 없습니다. 이 문제는 C11 이후 결함 보고서 DR488 에 의해 수정되었습니다.
예제
이 예제는 결함 보고서 488 에 대한 수정이 적용되었다고 가정합니다.
#include <climits> #include <clocale> #include <cuchar> #include <iomanip> #include <iostream> #include <string_view> int main() { std::setlocale(LC_ALL, "en_US.utf8"); std::u16string_view strv = u"zß水🍌"; // or z\u00df\u6c34\U0001F34C std::cout << "Processing " << strv.size() << " UTF-16 code units: [ "; for (char16_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 (char16_t c : strv) { std::size_t rc = std::c16rtomb(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 5 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c ] 0x7a converted to [ 0x7a ] 0xdf converted to [ 0xc3 0x9f ] 0x6c34 converted to [ 0xe6 0xb0 0xb4 ] 0xd83c converted to [ ] 0xdf4c converted to [ 0xf0 0x9f 0x8d 0x8c ]
참고 항목
|
(C++11)
|
좁은 멀티바이트 문자를 UTF-16 인코딩으로 변환합니다
(함수) |
|
(C++20)
|
UTF-8 문자열을 좁은 멀티바이트 인코딩으로 변환합니다
(함수) |
|
[virtual]
|
InternT
에서
ExternT
로 문자열을 변환합니다(예: 파일에 쓸 때)
(
std::codecvt<InternT,ExternT,StateT>
의 가상 protected 멤버 함수)
|
|
C documentation
for
c16rtomb
|
|