Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: out, do_out

From cppreference.net
헤더에 정의됨 <locale>
public :

result out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(1)
protected :

virtual result do_out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(2)
1) Public 멤버 함수, 가장 파생된 클래스의 do_out 멤버 함수를 호출합니다.
2) codecvt 패싯이 변환을 정의하는 경우, 소스 범위 [ from , from_end ) 의 내부 문자들을 외부 문자로 변환하여 그 결과를 to 에서 시작하는 이후 위치들에 배치합니다. from_end - from 개를 초과하는 내부 문자를 변환하지 않으며 to_end - to 개를 초과하는 외부 문자를 기록하지 않습니다. from_next to_next 는 성공적으로 변환된 마지막 요소의 다음을 가리키도록 남깁니다.

만약 이 codecvt 패싯이 변환을 정의하지 않으면, 어떤 문자도 변환되지 않습니다. to_next to 와 동일하게 설정되고, state 는 변경되지 않으며, std::codecvt_base::noconv 가 반환됩니다.

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) 는 반드시 ok 를 반환해야 합니다

  • codecvt 패싯은 basic_filebuf 에서 사용되며,
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) ok 를 반환하며, 이때 from ! = from_end 입니다.

목차

반환값

std::codecvt_base::result 타입의 값으로, 다음과 같은 성공 상태를 나타냅니다:

ok 변환 완료
partial 출력 버퍼 공간 부족 또는 예상치 못한 소스 버퍼의 끝
error 변환할 수 없는 문자 발견
noconv 이 패싯은 비변환형이며, 출력이 작성되지 않음

비변환 특수화 std:: codecvt < char , char , std:: mbstate_t > 는 항상 std::codecvt_base::noconv 를 반환합니다.

참고 사항

다음을 요구합니다: from <= from_end && to <= to_end 그리고 state 가 초기 시프트 상태를 나타내거나 시퀀스의 이전 문자들을 변환하여 얻은 상태여야 합니다.

codecvt 가 N:M 변환(예: UTF-16에서 UTF-8로의 변환, 여기서 두 개의 내부 문자가 출력할 외부 문자를 결정하는 데 필요할 수 있음)을 지원하는 반면, std::basic_filebuf 는 1:N 변환을 정의하는 codecvt 패싯만 사용할 수 있습니다. 즉, 파일에 기록할 때 한 번에 하나의 내부 문자를 처리할 수 있어야 합니다.

N:M 변환을 수행할 때, 이 함수는 모든 소스 문자를 소비한 후( from_next == from_end ) std::codecvt_base::partial 을 반환할 수 있습니다. 이는 변환을 완료하기 위해 또 다른 내부 문자가 필요함을 의미합니다 (예: UTF-16을 UTF-8로 변환할 때 소스 버퍼의 마지막 문자가 high surrogate인 경우).

state 에 미치는 영향은 의도적으로 명시되지 않았습니다. 표준 패싯에서는 std:: wcsrtombs 를 호출할 때와 같이 시프트 상태를 유지하는 데 사용되므로, 마지막으로 성공적으로 변환된 문자 이후의 시프트 상태를 반영하도록 업데이트됩니다. 그러나 사용자 정의 패싯은 이를 사용하여 다른 상태(예: 특수 문자의 개수 카운트)를 자유롭게 유지할 수 있습니다.

예제

#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());
    std::wstring internal = L"z\u00df\u6c34\U0001f34c"; // L"zß水🍌"
    // 다음 작업은 wstring_convert로도 수행 가능함
    std::mbstate_t mb{}; // 초기 시프트 상태
    std::string external(internal.size() * f.max_length(), '\0'); 
    const wchar_t* from_next;
    char* to_next;
    f.out(mb, &internal[0], &internal[internal.size()], from_next,
              &external[0], &external[external.size()], to_next);
    // 간결함을 위해 오류 검사 생략
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

출력:

The string in narrow multibyte encoding: zß水🍌

결함 보고서

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

DR 적용 대상 게시된 동작 올바른 동작
LWG 76 C++98 변환이 한 번에 하나의 내부 문자를 취하는 것을
지원해야 하는지 여부가 불분명했음
basic_filebuf 에 의해 사용되는 경우에만 필요

참고 항목

[virtual]
퍼트 영역에서 연관된 파일로 문자를 기록함
( std::basic_filebuf<CharT,Traits> 의 virtual protected 멤버 함수)
와이드 문자열을 바이트 문자열로 변환함
( std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> 의 public 멤버 함수)
상태 정보를 사용하여 와이드 문자열을 좁은 멀티바이트 문자열로 변환함
(함수)
[virtual]
파일에서 읽을 때처럼 ExternT 에서 InternT 로 문자열을 변환함
(virtual protected 멤버 함수)