我只是尝试在UTF-8中使用stringstream:

#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_tchar32_t也会发生相同的问题。以下gcc错误报告具有类似的测试用例。

  • https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88508

  • 还在下面讨论该问题:
  • GCC 4.8 and char16_t streams - bug?
  • Why does `std::basic_ifstream<char16_t>` not work in 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哨兵对象静默吞下,然后设置badbitfailbit)。

    C++标准仅要求提供ctype<char>ctype<wchar_t>。参见[locale.category]p2

    关于c++ - 无法从basic_stringstream <char8_t>读取char8_t,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57406448/

    10-11 22:35