7

我只是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,但我不知道如何纠正。请帮我!

4

1 回答 1

6

这实际上是一个老问题,并不特定于支持char8_t. 在 C++11 及更新版本中char16_t或中会出现同样的问题。char32_t以下 gcc 错误报告有一个类似的测试用例。

这个问题也在下面讨论:

问题是 gcc 并没有隐式地为全局语言环境注入ctype<char8_t>,ctype<char16_t>ctype<char32_t>. 当尝试执行需要这些方面之一的操作时,std::bad_cast会引发异常std::__check_facet(随后被为字符提取运算符创建的 IOS 哨兵对象默默吞下,然后设置badbitand failbit)。

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

于 2019-08-12T02:08:57.380 回答