Я пытаюсь обрабатывать строку 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
работает правильно.
Активация IOStreams на разных типах символов, чем char
и wchar_t
, довольно нетривиальна. Потокам требуется количество std::locale
. Без них они не будут функционировать должным образом. Для попытки операции вам потребуется, по крайней мере:
std::ctype<cT>
std::numpunct<cT>
std::num_get<cT>
где cT
- тип символа потока. Последний из них должен просто потребовать создания экземпляра, но другие должны быть реализованы. Конечно, вам также необходимо убедиться, что std::locale
установлен для потока, либо установив его как глобальную локаль, либо используя stream.imbue()
.
Лично я считаю, что это, в общем, неправильный подход: символы должны быть преобразованы во внутреннее представление при входе в систему и преобразованы во внешнее представление при выходе из системы (что цель std::codecvt<...>
фасет). Кажется, однако, что это потерянная битва, и люди чувствуют, что хотят возиться с кодировками внутри страны.
unsigned short
строк? Могу ли я как-то использоватьstd::wstring
для его обработки без ручного преобразования массива шорт в массивwchar_t
? Проблема в том, что на моей платформеwchar_t
составляет 4 байта.wchar_t
.