无法从 basic_stringstream<char8_t> 读取 char8_t
Canot read char8_t from 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
时好像出错了,但我不知道如何更正。请帮助我!
这实际上是一个老问题,并非专门针对 char8_t
的支持。 C++11 及更新版本中的 char16_t
或 char32_t
也会出现同样的问题。以下 gcc 错误报告有类似的测试用例。
该问题也在以下讨论:
问题是 gcc 不会隐式地为全局区域设置 ctype<char8_t>
、ctype<char16_t>
或 ctype<char32_t>
。当尝试执行需要这些方面之一的操作时,从 std::__check_facet
抛出 std::bad_cast
异常(随后被为字符提取运算符创建的 IOS 哨兵对象静默吞没,并且然后设置 badbit
和 failbit
).
C++标准只要求提供ctype<char>
和ctype<wchar_t>
。参见 [locale.category]p2。
我只是想 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
时好像出错了,但我不知道如何更正。请帮助我!
这实际上是一个老问题,并非专门针对 char8_t
的支持。 C++11 及更新版本中的 char16_t
或 char32_t
也会出现同样的问题。以下 gcc 错误报告有类似的测试用例。
该问题也在以下讨论:
问题是 gcc 不会隐式地为全局区域设置 ctype<char8_t>
、ctype<char16_t>
或 ctype<char32_t>
。当尝试执行需要这些方面之一的操作时,从 std::__check_facet
抛出 std::bad_cast
异常(随后被为字符提取运算符创建的 IOS 哨兵对象静默吞没,并且然后设置 badbit
和 failbit
).
C++标准只要求提供ctype<char>
和ctype<wchar_t>
。参见 [locale.category]p2。