【发布时间】: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++