相关疑难解决方法(0)

iostreams - 将`wchar_t`或`charXX_t`值打印为字符

如果将a wchar_t,char16_tchar32_t值提供给狭窄的ostream,它将打印代码点的数值.

#include <iostream>
using std::cout;
int main()
{
    cout << 'x' << L'x' << u'x' << U'x' << '\n';
}
Run Code Online (Sandbox Code Playgroud)

打印x120120120.这是因为有一个与它operator<<的特定组合,但是对于其他字符类型没有类似的运算符,所以它们以这种方式静默转换和打印.类似地,非窄字符串(,,)将被默默地转换为与打印为指针值,和非窄字符串对象(,,)甚至不会编译.basic_ostreamcharTintL"x"u"x"U"X"void*wstringu16stringu32string

因此,问题:什么是打印最少可怕的方式wchar_t,char16_tchar32_t在一个狭窄的ostream值,作为字符,而不是作为码点的数值?它应该正确地将在ostream的编码中可表示的所有代码点转换为该编码,并且应该在代码点不可表示时报告错误.(例如,给定u'…'和UTF-8 ostream,应将三字节序列0xE2 0x80 0xA6写入流;但是给定u'â'和KOI8-R ostream,应报告错误.)

同样,如何在狭窄的ostream上打印非窄C字符串或字符串对象,转换为输出编码?

如果在ISO C++ 11中无法做到这一点,我将采用特定于平台的答案.

(灵感来自这个问题.)

c++ iostream widechar

6
推荐指数
1
解决办法
226
查看次数

标签 统计

c++ ×1

iostream ×1

widechar ×1