여기 std::codecvt_utf8<>
패싯을 사용하여 wchar_t
을 UTF-8로 변환하는 코드 스 니펫입니다. Visual Studio 2012를 사용하면 기대치가 충족되지 않습니다 (코드 끝 부분의 조건 참조). 내 기대가 잘못 되었습니까? 왜? 아니면 Visual Studio 2012 라이브러리 문제입니까?std :: codecvt_utf8 패싯의 문제
#include <locale>
#include <codecvt>
#include <cstdlib>
int main()
{
std::mbstate_t state = std::mbstate_t();
std::locale loc (std::locale(), new std::codecvt_utf8<wchar_t>);
typedef std::codecvt<wchar_t, char, std::mbstate_t> codecvt_type;
codecvt_type const & cvt = std::use_facet<codecvt_type> (loc);
wchar_t ch = L'\u5FC3';
wchar_t const * from_first = &ch;
wchar_t const * from_mid = &ch;
wchar_t const * from_end = from_first + 1;
char out_buf[1];
char * out_first = out_buf;
char * out_mid = out_buf;
char * out_end = out_buf + 1;
std::codecvt_base::result cvt_res
= cvt.out (state, from_first, from_end, from_mid,
out_first, out_end, out_mid);
// This is what I expect:
if (cvt_res == std::codecvt_base::partial
&& out_mid == out_end
&& state != 0)
;
else
abort();
}
여기서 기대 한번에 UTF-8 변환하지만 상기 조건부 if
중간의 out()
기능 출력 한 바이트 비주얼 스튜디오와 거짓이다 2012
UPDATE
무엇이 실패하면 out_mid == out_end
및 state != 0
조건입니다. 기본적으로, 적어도 하나의 바이트가 생성되고, UTF-8 시퀀스의 다음 바이트가 생성 가능해야하는 상태가 state
변수에 저장 될 것으로 기대합니다.
내가 기대하는 부분에 대해 당신이 논쟁하고있는 부분이 확실하지 않습니다. 분명히 해줄 수 있니? – wilx
@wilx 함수는 멀티 바이트 문자가 아닌 바이트를 생성 할 것으로 기대합니다. 그렇게 할 수 없도록 지정된 적이 없으며 기존의 구현뿐만 아니라 비슷한 기능이 명시되어 있습니다. – Cubbi
당신이 옳다고 가정하면 버퍼가 얼마나 커야하나요? 'std :: codecvt :: max_length()'? – wilx