【发布时间】:2011-03-17 23:08:06
【问题描述】:
我正在使用 unicode/宽字符,我正在尝试创建一个 toString 方法 (Java ::toString equiv)。 ostream 是否会处理宽字符,如果是的话,有没有办法警告流的消费者它是 unicode 出来的?
【问题讨论】:
标签: c++ unicode wchar-t ostream
我正在使用 unicode/宽字符,我正在尝试创建一个 toString 方法 (Java ::toString equiv)。 ostream 是否会处理宽字符,如果是的话,有没有办法警告流的消费者它是 unicode 出来的?
【问题讨论】:
标签: c++ unicode wchar-t ostream
ostream 和 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 library。
【讨论】:
宽字符串是不可移植的,最好在 C++ 中避免使用。它们可以是 UTF-16、UTF-32 甚至是非 Unicode,具体取决于平台。
C++ 中的常用方法是在内部使用 UTF-8 编码的多字节 char 字符串,并在必要时在系统边界进行转码。大多数现代系统(例如 Linux 和 macOS)都可以很好地使用 UTF-8,因此将它们传递给输出流是可行的。由于遗留代码页,Windows 是最成问题的。您可以使用Boost Nowide 或the {fmt} library 进行便携式UTF-8 输出。
免责声明:我是 {fmt} 的作者。
【讨论】: