Namespaces
Variants

std:: codecvt_utf8_utf16

From cppreference.net
헤더 파일에 정의됨 <codecvt>
template <

class Elem,
unsigned long Maxcode = 0x10ffff ,
std:: codecvt_mode Mode = ( std:: codecvt_mode ) 0 >
class codecvt_utf8_utf16

: public std:: codecvt < Elem, char , std:: mbstate_t > ;
(C++11부터)
(C++17부터 사용 중단)
(C++26에서 제거됨)

std::codecvt_utf8_utf16 는 UTF-8로 인코딩된 바이트 문자열과 UTF-16으로 인코딩된 문자 문자열 간의 변환을 캡슐화하는 std::codecvt 패싯입니다. 만약 Elem 이 32비트 타입이라면, 하나의 UTF-16 코드 유닛이 출력 시퀀스의 각 32비트 문자에 저장됩니다.

이것은 N:M 변환 패싯이며, std::basic_filebuf (내부 인코딩과 외부 인코딩 간에 UTF-32/UTF-8과 같은 1:N 변환만 허용함)와 함께 사용할 수 없습니다. 이 패싯은 std::wstring_convert 와 함께 사용할 수 있습니다.

목차

템플릿 매개변수

Elem - either char16_t , char32_t , or wchar_t
Maxcode - 이 패싯이 오류 없이 읽거나 쓸 수 있는 Elem 의 최대값
Mode - std::codecvt_mode 타입의 상수

멤버 함수

(constructor)
새로운 codecvt_utf8_utf16 패싯을 생성함
(public member function)
(destructor)
codecvt_utf8_utf16 패싯을 파괴함
(public member function)

std::codecvt_utf8_utf16:: codecvt_utf8_utf16

explicit codecvt_utf8_utf16 ( std:: size_t refs = 0 ) ;

새로운 std::codecvt_utf8_utf16 패싯을 생성하며, 초기 참조 카운터 refs 를 기본 클래스에 전달합니다.

매개변수

refs - 패싯에 연결되는 참조 횟수

std::codecvt_utf8_utf16:: ~codecvt_utf8_utf16

~codecvt_utf8_utf16 ( ) ;

패싯을 파괴합니다. 로캘에 의해 관리되는 패싯과 달리, 이 패싯의 소멸자는 공개되어 있습니다.

std:: codecvt 에서 상속됨

중첩 타입

유형 정의
intern_type internT
extern_type externT
state_type stateT

데이터 멤버

멤버 설명
std::locale::id id [static] facet 의 식별자

멤버 함수

do_out 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_in 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_unshift 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_encoding 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_always_noconv 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_length 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)
do_max_length 을 호출합니다
( std::codecvt<InternT,ExternT,StateT> 의 public 멤버 함수)

보호된 멤버 함수

[virtual]
InternT 에서 ExternT 로 문자열을 변환합니다(예: 파일에 쓸 때)
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
[virtual]
ExternT 에서 InternT 로 문자열을 변환합니다(예: 파일에서 읽을 때)
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
[virtual]
불완전한 변환을 위한 ExternT 문자들의 종료 문자 시퀀스를 생성합니다
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
[virtual]
하나의 InternT 문자를 생성하는 데 필요한 ExternT 문자 수를 반환합니다(상수일 경우)
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
모든 유효한 인수 값에 대해 항등 변환을 인코딩하는지 테스트합니다
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
[virtual]
주어진 InternT 버퍼로 변환될 때 소비될 ExternT 문자열의 길이를 계산합니다
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)
[virtual]
단일 InternT 문자로 변환될 수 있는 최대 ExternT 문자 수를 반환합니다
( std::codecvt<InternT,ExternT,StateT> 의 virtual protected member function)

std:: codecvt_base 로부터 상속됨

중첩 타입 정의
enum result { ok, partial, error, noconv } ; 범위 없는 열거형 타입
열거형 상수 정의
ok 오류 없이 변환이 완료됨
partial 모든 소스 문자가 변환되지 않음
error 유효하지 않은 문자를 만남
noconv 변환이 필요 없음, 입력과 출력 타입이 동일함

예제

#include <cassert>
#include <codecvt>
#include <cstdint>
#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::string u8 = "z\u00df\u6c34\U0001f34c";
    std::u16string u16 = u"z\u00df\u6c34\U0001f34c";
    // UTF-8 to UTF-16/char16_t
    std::u16string u16_conv = std::wstring_convert<
        std::codecvt_utf8_utf16<char16_t>, char16_t>{}.from_bytes(u8);
    assert(u16 == u16_conv);
    std::cout << "UTF-8 to UTF-16 conversion produced " << u16_conv.size()
              << " code units:\n" << std::showbase << std::hex;
    for (char16_t c : u16_conv)
        std::cout << static_cast<std::uint16_t>(c) << ' ';
    // UTF-16/char16_t to UTF-8
    std::string u8_conv = std::wstring_convert<
        std::codecvt_utf8_utf16<char16_t>, char16_t>{}.to_bytes(u16);
    assert(u8 == u8_conv);
    std::cout << "\nUTF-16 to UTF-8 conversion produced "
              << std::dec << u8_conv.size() << " bytes:\n" << std::hex;
    for (char c : u8_conv)
        std::cout << +static_cast<unsigned char>(c) << ' ';
    std::cout << '\n';
}

출력:

UTF-8 to UTF-16 conversion produced 5 code units:
0x7a 0xdf 0x6c34 0xd83c 0xdf4c
UTF-16 to UTF-8 conversion produced 10 bytes:
0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2229 C++98 생성자와 소멸자가 명시되지 않았음 이를 명시함

참고 항목

문자
변환
로케일 정의 멀티바이트
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (C11의 DR488 포함)

codecvt < char16_t , char ,mbstate_t >
codecvt_utf8_utf16 < char16_t >
codecvt_utf8_utf16 < char32_t >
codecvt_utf8_utf16 < wchar_t >

해당 없음
UCS-2 c16rtomb (C11의 DR488 미포함) codecvt_utf8 < char16_t > codecvt_utf16 < char16_t >
UTF-32

mbrtoc32 / c32rtomb

codecvt < char32_t , char ,mbstate_t >
codecvt_utf8 < char32_t >

codecvt_utf16 < char32_t >

시스템 wchar_t :

UTF-32 (비윈도우)
UCS-2 (윈도우)

mbsrtowcs / wcsrtombs
use_facet < codecvt
< wchar_t , char ,mbstate_t >> ( locale )

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
UTF-8, UTF-16, UTF-32를 포함한 문자 인코딩 간 변환
(클래스 템플릿)
(C++11) (C++17에서 사용 중단됨) (C++26에서 제거됨)
표준 codecvt 패싯의 동작을 변경하는 태그
(열거형)
(C++11) (C++17에서 사용 중단됨) (C++26에서 제거됨)
UTF-8과 UCS-2/UCS-4 간 변환
(클래스 템플릿)
(C++11) (C++17에서 사용 중단됨) (C++26에서 제거됨)
UTF-16과 UCS-2/UCS-4 간 변환
(클래스 템플릿)