【问题标题】:Writing Unicode Characters to an OStream将 Unicode 字符写入 OStream
【发布时间】:2011-03-17 23:08:06
【问题描述】:

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

【问题讨论】:

    标签: c++ unicode wchar-t ostream


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-09-04
        • 1970-01-01
        • 2011-08-10
        • 2015-04-18
        • 2019-05-22
        相关资源
        最近更新 更多