【问题标题】:streams, stream_bufs, codecvt facets and \n to \r\n translation流、stream_bufs、codecvt facets 和 \n 到 \r\n 转换
【发布时间】:2012-06-06 21:50:35
【问题描述】:

\r\r\n 转换的 C++ IO 流的哪一部分?是stream_buf 本身还是codecvt facet 的内部到外部编码转换的一部分?

更新 1

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

【问题讨论】:

  • 不应该是\n\r\n的转换吗?通常你会从可移植代码中得到一个\n,你需要在“windows like”表示之前添加换行符。
  • 附加的\r与使用的字符编码无关,它仍然是一个额外的字符。对于某些终端,\r 控制终端写入光标从第 0 列开始。 codecvt 控制用于编码单个字符的字节数。

标签: c++ iostream streambuf codecvt


【解决方案1】:

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

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

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

【讨论】:

  • streambuf 实现不一定需要使用 fputc(),这取决于上下文。我们有streambuf的实现,直接输出到UART进行调试,使用的(RT)OS甚至不提供文件句柄,那么如何使用fputc()呢??
  • @g-makulik std::cout 使用的 streambuf 需要使用与 CI/O 在写入 stdout 时使用的相同的底层缓冲区,因此这将是非标准的.至于 filebuf 和其他 streambuf,嗯,这就是我“通常”的用途。
【解决方案2】:

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

【讨论】:

  • 与 Éric Malenfant 的回答相同的评论:为什么在 filebuf 中完成?这是否意味着 filebuf 必须对 codecvt facet 提供的外部编码有所了解?
  • 它与字符编码恕我直言无关,而是操作系统如何处理终端显示中的行尾。
【解决方案3】:

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

【讨论】:

  • 为什么要在filebuf完成?这是否意味着filebuf 必须对codecvt facet 提供的外部编码有所了解?
猜你喜欢
  • 1970-01-01
  • 2023-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多