Namespaces
Variants

std:: codecvt_utf16

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

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

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

std::codecvt_utf16 는 UTF-16으로 인코딩된 바이트 문자열과 UCS-2 또는 UTF-32 문자 문자열( Elem 의 타입에 따라) 간의 변환을 캡슐화하는 std::codecvt 패싯입니다. 이 std::codecvt 패싯은 바이너리 모드에서 UTF-16 파일을 읽고 쓰는 데 사용할 수 있습니다.

UCS-2는 UTF-16의 하위 집합인 구식 인코딩으로, U+0000-U+FFFF(기본 다국어 평면) 범위의 스칼라 값만 인코딩합니다.

목차

템플릿 매개변수

Elem - char16_t , char32_t , 또는 wchar_t 중 하나
Maxcode - 이 facet이 오류 없이 읽거나 쓸 수 있는 Elem 의 최대값
Mode - std::codecvt_mode 타입의 상수

멤버 함수

(constructor)
새로운 codecvt_utf16 패싯을 생성합니다
(public member function)
(destructor)
codecvt_utf16 패싯을 파괴합니다
(public member function)

std::codecvt_utf16:: codecvt_utf16

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

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

매개변수

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

std::codecvt_utf16:: ~codecvt_utf16

~codecvt_utf16 ( ) ;

파싯을 파괴합니다. 로캘에 의해 관리되는 파싯들과 달리, 이 파싯의 소멸자는 public입니다.

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

std:: codecvt_base 로부터 상속됨

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

참고 사항

표준에서는 Elem 의 크기가 16비트일 때 이 패싯이 UCS-2와 함께 작동해야 하지만, 일부 구현에서는 대신 UTF-16을 사용하여 이를 비변환 로캘로 만듭니다. "UCS-2"라는 용어는 더 이상 사용되지 않으며 ISO 10646에서 제거되었습니다.

예제

다음 예제는 32비트 wchar_t 를 사용하는 시스템에서 UTF-16le 파일의 디코딩을 보여줍니다. 16비트 wchar_t 를 사용하는 시스템에서는, std :: codecvt_utf16 < char16_t > 가 UTF-16이 아닌 UCS-2를 생성하기 때문에 세 번째 문자 디코딩이 실패합니다.

#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
void prepare_file()
{
    // UTF-16le data (if host system is little-endian)
    char16_t utf16le[4] = {0x007a,          // latin small letter 'z' U+007a
                           0x6c34,          // CJK ideograph "water"  U+6c34
                           0xd834, 0xdd0b}; // musical sign segno U+1d10b    
    // store in a file
    std::ofstream fout("text.txt");
    fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le);
}
int main()
{
    prepare_file();
    // open as a byte stream
    std::wifstream fin("text.txt", std::ios::binary);
    // apply facet
    fin.imbue(std::locale(fin.getloc(),
        new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
    wchar_t c = 0;
    for (std::cout << std::showbase << std::hex; fin.get(c);
         std::cout << static_cast<std::wint_t>(c) << '\n');
}

출력:

0x7a
0x6c34
0x1d10b

결함 보고서

다음 동작 변경 결함 보고서는 이전에 게시된 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-8과 UTF-16 간 변환
(클래스 템플릿)