Не могу прочитать char8_t из basic_stringstream<char8_t>
Я просто пытаюсь stringstream
в UTF-8:
#include<iostream>
#include<string>
#include<sstream>
int main()
{
std::basic_stringstream<char8_t> ss(u8"hello");
char8_t c;
std::cout << (ss.rdstate() & std::ios_base::goodbit) << " " << (ss.rdstate() & std::ios_base::badbit) << " "
<< (ss.rdstate() & std::ios_base::failbit) << " " << (ss.rdstate() & std::ios_base::eofbit) << "\n";
ss >> c;
std::cout << (ss.rdstate() & std::ios_base::goodbit) << " " << (ss.rdstate() & std::ios_base::badbit) << " "
<< (ss.rdstate() & std::ios_base::failbit) << " " << (ss.rdstate() & std::ios_base::eofbit) << "\n";
std::cout << c;
return 0;
}
Компиляция с использованием:
g++-9 -std=c++2a -g -o bin/test test/test.cpp
Результат на экране:
0 0 0 0
0 1 4 0
0
Кажется, что-то идет не так при чтении c
, но я не знаю, как это исправить. Пожалуйста, помогите мне!
1 ответ
На самом деле это старая проблема, не относящаяся к поддержке char8_t
, Та же проблема возникает с char16_t
или же char32_t
в C++11 и новее. Следующий отчет об ошибке gcc имеет похожий тестовый пример.
Эта проблема также обсуждается в следующем:
- GCC 4.8 и потоки char16_t - ошибка?
- Почему `std:: basic_ifstream
` не работает в C++11? - http://gcc.1065356.n8.nabble.com/UTF-16-streams-td1117792.html
Проблема в том, что gcc неявно не наделяет глобальную локаль гранями для ctype<char8_t>
, ctype<char16_t>
, или же ctype<char32_t>
, При попытке выполнить операцию, которая требует одного из этих аспектов, std::bad_cast
исключение выдается из std::__check_facet
(который впоследствии молча проглатывается сторожевым объектом IOS, созданным для оператора извлечения символов, и который затем устанавливает badbit
а также failbit
).
Стандарт C++ требует только, чтобы ctype<char>
а также ctype<wchar_t>
предоставляться. Смотрите [locale.category] p2.