std :: bad_cast при использовании std :: basic_istringstream <unsigned short>

0

Я пытаюсь обрабатывать строку UTF-16 (помещенную в буфер buf) с помощью std::basic_string и istringstream. В этом коде происходит исключение std::bad_cast. Есть ли проблема с моим кодом? Или gcc STL просто не может обрабатывать символы unsigned int (16 бит)?

const unsigned short * buf;
// ... fiilling buf
std::basic_string<unsigned short> w(buf);
std::basic_istringstream<unsigned short> iss(w);

unsigned int result;
try { iss >> result; }
catch (std::exception& e)
{
   const char * c = e.what();
}

Тот же код с std::wstring и std::wistringstream работает правильно.

Теги:
string
gcc
stdstring
istringstream

1 ответ

1

Активация IOStreams на разных типах символов, чем char и wchar_t, довольно нетривиальна. Потокам требуется количество std::locale. Без них они не будут функционировать должным образом. Для попытки операции вам потребуется, по крайней мере:

  • std::ctype<cT>
  • std::numpunct<cT>
  • std::num_get<cT>

где cT - тип символа потока. Последний из них должен просто потребовать создания экземпляра, но другие должны быть реализованы. Конечно, вам также необходимо убедиться, что std::locale установлен для потока, либо установив его как глобальную локаль, либо используя stream.imbue().

Лично я считаю, что это, в общем, неправильный подход: символы должны быть преобразованы во внутреннее представление при входе в систему и преобразованы во внешнее представление при выходе из системы (что цель std::codecvt<...> фасет). Кажется, однако, что это потерянная битва, и люди чувствуют, что хотят возиться с кодировками внутри страны.

  • 0
    Спасибо, это объясняет. Что если у меня есть допустимая широкая строка, которая просто хранится как массив unsigned short строк? Могу ли я как-то использовать std::wstring для его обработки без ручного преобразования массива шорт в массив wchar_t ? Проблема в том, что на моей платформе wchar_t составляет 4 байта.
  • 0
    Предполагая, что ваши исходные данные в кодировке UTF-16, я предполагаю, что подход будет заключаться в преобразовании их во внутреннюю кодировку wchar_t .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню