5

我正在使用 unicode/宽字符,并且正在尝试创建一个 toString 方法(Java ::toString equiv)。ostream 是否会处理宽字符,如果是这样,有没有办法警告流的消费者它是 unicode 出来的?

4

2 回答 2

3

无论ostream是 C++ 的其余部分还是 C++ 的其他部分,都对 Unicode 一无所知。通常你在 C++ 中编写一个字符串转换如下:

template<typename Char, typename Traits>
std::basic_ostream<Char, Traits>&
operator<<(std::basic_ostream<Char, Traits>& stream, const YourType& object) {
    return stream << object.a << object.b;  // or whatever
}

你是否得到类似 Unicode 的东西取决于实现。C++ 中的流绝不是 Java 意义上的文本流,C++ 的字符串也不是 Java 意义上的字符串。如果你想要一个真正的 Unicode 字符串,你可能想看看ICU 库

于 2010-07-19T14:52:42.007 回答
0

宽字符串是不可移植的,最好在 C++ 中避免使用。它们可以是 UTF-16、UTF-32 甚至是非 Unicode,具体取决于平台。

C++ 中的常用方法是在char内部使用 UTF-8 编码的多字节字符串,如有必要,在系统边界进行转码。大多数现代系统(如 Linux 和 macOS)都可以很好地使用 UTF-8,因此将它们传递给输出流是可行的。由于遗留代码页,Windows 是最成问题的。您可以使用Boost Nowide{fmt} 库进行可移植的 UTF-8 输出。

免责声明:我是 {fmt} 的作者。

于 2020-12-16T16:47:40.063 回答