我正在使用 unicode/宽字符,并且正在尝试创建一个 toString 方法(Java ::toString equiv)。ostream 是否会处理宽字符,如果是这样,有没有办法警告流的消费者它是 unicode 出来的?
问问题
1447 次
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 回答