Namespaces
Variants

std:: codecvt_byname

From cppreference.net
헤더 파일에 정의됨 <locale>
template < class InternT, class ExternT, class State >
class codecvt_byname : public std:: codecvt < InternT, ExternT, State > ;

std::codecvt_byname 는 생성 시 지정된 로캘의 멀티바이트/와이드 문자 변환 규칙을 캡슐화하는 std::codecvt 패싯입니다.

목차

특수화

표준 라이브러리는 다음과 같은 특수화를 제공함을 보장합니다:

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

멤버 함수

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

std::codecvt_byname:: codecvt_byname

explicit codecvt_byname ( const char * name, std:: size_t refs = 0 ) ;
explicit codecvt_byname ( const std:: string & name, std:: size_t refs = 0 ) ;
(C++11부터)

std::codecvt_byname 패싯을 name 로케일에 대해 새로 생성합니다.

refs 는 리소스 관리에 사용됩니다: refs == 0 이면, 구현은 이 패싯을 포함하는 마지막 std::locale 객체가 소멸될 때 패싯을 파괴합니다. 그렇지 않으면 객체는 파괴되지 않습니다.

매개변수

name - 로케일의 이름
refs - 패싯에 연결되는 참조 횟수

std::codecvt_byname:: ~codecvt_byname

protected :
~codecvt_byname ( ) ;

해당 패싯(facet)을 파괴합니다.

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

std:: codecvt_base 로부터 상속됨

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

예제

이 예제는 GB18030 인식 로캘의 codecvt 패싯을 사용하여 GB18030 인코딩된 파일을 읽는 방법을 보여줍니다.

#include <fstream>
#include <iostream>
#include <locale>
#include <string>
int main()
{
    // GB18030 narrow multibyte encoding
    std::ofstream("text.txt") << "\x7a"              // letter 'z', U+007a
                                 "\x81\x30\x89\x38"  // letter 'ß', U+00df
                                 "\xcb\xae"          // CJK ideogram '水' (water), U+6c34
                                 "\x94\x32\xbc\x35"; // musical sign '𝄋' (segno), U+1d10b
    std::wifstream fin("text.txt");
    fin.imbue(std::locale(fin.getloc(),
              new std::codecvt_byname<wchar_t, char, std::mbstate_t>("zh_CN.gb18030")));
    for (wchar_t c; fin.get(c);)
        std::cout << std::hex << std::showbase << static_cast<unsigned>(c) << '\n';
}

가능한 출력:

0x7a
0xdf
0x6c34
0x1d10b

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 21 C++98 표준 라이브러리가
어떤 std::codecvt_byname 특수화도 제공할 필요가 없었음
두 가지 특수화가 필요함

참고 항목

UTF-8, UTF-16, UTF-32를 포함한 문자 인코딩 간 변환
(클래스 템플릿)