5

C++ IO 流的哪一部分进行了\rto\r\n转换?它是它stream_buf本身还是它是通过codecvt方面的内部到外部编码转换的一部分?

更新 1

你们都说是在streambuf/filebuf中完成的。好的。但是这种安排如何处理,例如,像 UTF-16 这样的外部编码?然后似乎必须使用ios::binary禁用翻译的标志打开文件。

4

3 回答 3

2

这种转换(通常)不是由流、streambuf 或 facet 执行的。由 streambuf和fputc()调用的 C 库代码(例如)负责。overflow()underflow()

如果出于某种原因需要它(例如,在实现 dos2unix 例程时),boost.iostreams 中有一个方便的示例。

编辑:std::filebuf仅支持文本文件的多字节编码,例如 UTF-8 或 GB18030 或任何语言环境使用的编码。UTF-16 文件必须以二进制模式打开,作为纯字节流(可以使用 C++11 的 codecvt 工具将其解释为 UTF-16),是的,行尾不会被转换。

于 2012-06-06T22:20:52.347 回答
1

IFAIR 它是在 streambuf 实现中完成的,codecvt只处理语言环境表示的细节。

于 2012-06-06T22:10:15.723 回答
1

它由 std::filebuf 执行,如果它在没有 ios::binary 标志的情况下打开。

于 2012-06-06T22:43:32.210 回答