std::codecvt<InternT,ExternT,StateT>:: out, do_out
|
헤더에 정의됨
<locale>
|
||
|
public
:
result out
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_out
(
StateT
&
state,
|
(2) | |
do_out
멤버 함수를 호출합니다.
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 멤버 함수) |