Вот фрагмент кода, который использует фасет std::codecvt_utf8<>
для преобразования из wchar_t
в UTF-8. С Visual Studio 2012 мои ожидания не оправдались (см. условие в конце кода). Мои ожидания неверны? Почему? Или это проблема с библиотекой Visual Studio 2012?
#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 ();
}
Здесь ожидается, что функция out()
выводит по одному байту преобразования UTF-8 за раз, но середина условного выражения if
выше в Visual Studio 2012 ложна.
ОБНОВИТЬ
Что не удается, так это условия out_mid == out_end
и state != 0
. По сути, я ожидаю, что будет создан хотя бы один байт, а необходимое состояние для следующего байта последовательности UTF-8 будет сохранено в переменной state
.