Namespaces
Variants

std:: codecvt

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

class InternT,
class ExternT,
class StateT

> class codecvt ;

클래스 템플릿 std::codecvt 는 와이드 및 멀티바이트를 포함한 문자열 인코딩 간 변환을 캡슐화합니다. std:: basic_fstream < CharT > 를 통해 수행되는 모든 파일 입출력 작업은 스트림에 설정된 로캘의 std :: codecvt < CharT, char , std:: mbstate_t > 패싯을 사용합니다.

cpp/locale/codecvt base cpp/locale/locale/facet std-codecvt-inheritance.svg

상속 다이어그램

목차

특수화

표준 라이브러리는 다음과 같은 특수화를 제공함을 보장합니다 (이들은 모든 locale 객체에 의해 구현되어야 하는 요구사항 입니다):

헤더 파일에 정의됨 <locale>
std :: codecvt < char , char , std:: mbstate_t > 항등 변환
std :: codecvt < char16_t , char , std:: mbstate_t >
(C++11부터) (C++20에서 사용 중단됨)
UTF-16과 UTF-8 간 변환
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(C++20부터) (사용 중단됨)
UTF-16과 UTF-8 간 변환
std :: codecvt < char32_t , char , std:: mbstate_t >
(C++11부터) (C++20에서 사용 중단됨)
UTF-32과 UTF-8 간 변환
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(C++20부터) (사용 중단됨)
UTF-32과 UTF-8 간 변환
std :: codecvt < wchar_t , char , std:: mbstate_t > 시스템의 기본 와이드 문자 집합과 단일 바이트 좁은 문자 집합 간 변환

중첩 타입

유형 정의
intern_type InternT
extern_type ExternT
state_type StateT

데이터 멤버

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

멤버 함수

새로운 codecvt 패싯을 생성합니다
(public member function)
do_out 을 호출합니다
(public member function)
do_in 을 호출합니다
(public member function)
do_unshift 을 호출합니다
(public member function)
do_encoding 을 호출합니다
(public member function)
do_always_noconv 을 호출합니다
(public member function)
do_length 을 호출합니다
(public member function)
do_max_length 을 호출합니다
(public member function)

보호된 멤버 함수

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

std:: codecvt_base 로부터 상속됨

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

예제

다음 예제는 UTF-8 변환을 구현하는 로캘을 사용하여 UTF-8 파일을 읽고, codecvt < wchar_t , char , std:: mbstate_t > 을 사용하며, UTF-8 문자열을 UTF-16으로 변환하기 위해 std::codecvt 의 표준 특수화 중 하나를 사용합니다.

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
    std::ofstream("text.txt") << data;
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

출력:

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t >
std :: codecvt < char32_t , char8_t, std:: mbstate_t > 는 로케일 독립적임
이들을 사용 중단(deprecated) 처리함

참고 항목

문자
변환
로케일 정의 멀티바이트
(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 >
문자 변환 오류를 정의함
(클래스)
명명된 로케일에 대한 시스템 제공 std::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 간 변환
(클래스 템플릿)
(C++11) (C++17에서 사용 중단됨) (C++26에서 제거됨)
UTF-8과 UTF-16 간 변환
(클래스 템플릿)