Существует ли сценарий декодирования codecvt, где целевому буферу требуется место для более чем одного внутреннего символа? - PullRequest
1 голос
/ 23 ноября 2011

При использовании метода std::codecvt in для декодирования внешней последовательности байтов во внутреннюю последовательность символов существует ли ситуация, когда буферу назначения внутренних символов требуется пространство для более чем одного внутреннего символа?

Вот некоторый код для справки:

// const std::locale& loc;
// mbstate_t state;
// const char *extern_buf_ptr;
// const char *extern_buf_eptr;
const std::codecvt<wchar_t, char, mbstate_t> *pcodecvt = &std::use_facet<std::codecvt<wchar_t, char, mbstate_t> >(loc);

wchar_t intern_char;
wchar_t *tmp;
std::codecvt_base::result in_res = pcodecvt->in(state,
        extern_buf_ptr, extern_buf_eptr, extern_buf_ptr,
        &intern_char, &intern_char + 1, tmp);

Это упрощение некоторого кода шаблона, который я написал для декодирования байтов, считываемых по отдельности из Winsock SOCKET, где пользователь желает "небуферизованного" ввода,По сути, с каждой итерацией цикла байт считывается во внешний буфер.Цикл завершается, когда in_res не равен std::codecvt_base::partial.

Что мне интересно: существует ли сценарий, когда при вызове in() потребуется место в буфере назначения для более чем одного внутреннего символа?Т.е. есть ли сценарий, который бы сделал описанный выше цикл бесконечным циклом?

1 Ответ

3 голосов
/ 23 ноября 2011

В §22.4.1.4.2/3 имеется примечание на этот счет:

basic_filebuf предполагает, что сопоставления внутренних и внешних символов составляют от 1 до N: фасет codecvt, которыйиспользуется basic_filebuf должен уметь переводить символы по одному внутреннему символу за раз

Похоже, что любая локаль, которая подходит для потоков ввода-вывода, хороша и для вашего использования.

...