std:: codecvt
|
헤더 파일에 정의됨
<locale>
|
||
|
template
<
class
InternT,
|
||
클래스 템플릿
std::codecvt
는 와이드 및 멀티바이트를 포함한 문자열 인코딩 간 변환을 캡슐화합니다.
std::
basic_fstream
<
CharT
>
를 통해 수행되는 모든 파일 입출력 작업은 스트림에 설정된 로캘의
std
::
codecvt
<
CharT,
char
,
std::
mbstate_t
>
패싯을 사용합니다.
상속 다이어그램
목차 |
특수화
표준 라이브러리는 다음과 같은 특수화를 제공함을 보장합니다 (이들은 모든 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]
|
모든 유효한 인수 값에 대해 패싯이 항등 변환을 인코딩하는지 테스트함
(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
>
|
해당 없음 |
| UCS-2 | c16rtomb (C11의 DR488 없이) | codecvt_utf8 < char16_t > | codecvt_utf16 < char16_t > |
| UTF-32 |
codecvt
<
char32_t
,
char
,mbstate_t
>
|
codecvt_utf16 < char32_t > |
|
|
시스템
wchar_t
:
UTF-32
(비윈도우)
|
mbsrtowcs
/
wcsrtombs
|
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 간 변환
(클래스 템플릿) |