【问题标题】:Do the implementation of fstream family differs between platforms?fstream 系列的实现是否在平台之间有所不同?
【发布时间】:2018-05-31 11:42:37
【问题描述】:

我正在阅读http://utf8everywhere.org/#how.files

永远不要将 std::string 或 const char* 文件名参数传递给 fstream 系列。 MSVC CRT 不支持 UTF-8 参数,但它具有非标准扩展名,应按如下方式使用: ...
当 MSVC 对 fstream 的态度发生变化时,我们将不得不手动移除转换。

强调我的。

强调的文字是否表明 fstream 系列 的实现在平台之间有所不同?这是否表明在 Linux 系统下我可以安全地将 utf-8 std::string 或 char 传递给 fstream family?为什么 C++ 文档没有注意到平台差异http://en.cppreference.com/w/cpp/io/basic_fstream

新手确实需要一些确认,所以如果您能在添加一些解释的同时直接回答我的问题,我将不胜感激。

【问题讨论】:

  • 因为 cppreference 遵循标准,而 MSVC 并不在乎标准:)
  • C++ 的语言规范不保证支持 Unicode。无论如何,Window 在内部使用 UTF-16。
  • 整个标准库的实现因平台而异。
  • utf8everywhere.org - 鼓励您使用 UTF-8 作为内部字符串编码,但承认您需要在程序边界进行翻译。这包括文件名,因为本机操作系统可能不支持 UTF-8。
  • C++ 标准库的任何或所有部分的实现可能因平台而异。编译器供应商就是这样——他们以不同的方式在优化编译器和库方面展开竞争,他们希望这些方式比竞争对手的产品更适合程序员。该标准要求结果行为是一致的(除非行为未定义、未指定、实现定义等),但不需要特定的实现方式。

标签: c++


【解决方案1】:

首先,标准库是作为编译器环境的一部分提供的。这意味着由于有许多编译器编辑器,因此标准库有许多不同的实现。简单地说,所有人都必须遵守标准。但是是的,Microsoft 和 gcc 带有不同的标准库实现。话虽如此,您可以使用 MinGW 安装 gcc 完整开发环境,即使在 Windows 上也不会卡在 MSVC 中。

但是,显示 UTF8 文本的问题不仅与 stream 库实现有关,还与底层 终端 窗口有关。无法正确显示 UTF-8 文本的部分是托管 cmd.exe shell 的 Windows 控制台。并且那部分不依赖于使用的开发工具。

【讨论】:

    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2011-04-12
    • 2018-04-21
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多