为啥我的 std::wofstream 写 ansi?

Posted

技术标签:

【中文标题】为啥我的 std::wofstream 写 ansi?【英文标题】:Why does my std::wofstream write ansi?为什么我的 std::wofstream 写 ansi? 【发布时间】:2010-03-04 15:12:03 【问题描述】:

我有一个宽字符串,我正在将它写入我以 out|binary 模式打开的 wofstream。当我查看生成的文件时,它每隔一个字节就丢失了。

我期待当我在 Visual Studio 中使用二进制编辑器打开文件时,我会看到每隔一个字节都为零,但我没有看到零。

你知道我错过了什么吗?

谢谢。


代码是这样的:

CAtlStringW data = L"some data";
wofstream stream("c:\hello.txt", ios_base:out|ios_base:binary);
stream.write( data.GetBuffer(), data.GetLength() );
stream.close();

【问题讨论】:

你能给我们一些代码吗 ***.com/questions/1509277/… 的副本 这里的潜在解决方案:***.com/questions/207662/… 简短回答:因为 IOstream 库已损坏。 ;) 宽流只需要一串宽字符并将它们转换为常规字符,然后将它们写入流。所以L"Hello world" 写成"Hello world"。荒谬,但真实。 @jaff:不,不是。之所以这样设计,是因为并非所有系统都支持磁盘上的 unicode,因此该标准假定磁盘格式为 ANSI,即使内部是 unicode。 【参考方案1】:

请参阅页面底部的“社区内容”http://msdn.microsoft.com/en-us/library/f1d6b0fk(VS.80).aspx。简而言之,您必须使用 pubsetbuf() 为您的流使用基于 wchar_t 的内部缓冲区(而不是基于 char)。

【讨论】:

【参考方案2】:

当您使用输出宽流写入文件时,实际发生的是它将宽字符转换为其他 8 位编码。

如果您使用 UTF-8 语言环境,它会将宽字符串转换为 UTF-8 编码文本(但 MSVC 不提供 UTF-8 语言环境),因此通常它会尝试转换为某些代码页,如 cp1251 或 ASCII .

【讨论】:

以上是关于为啥我的 std::wofstream 写 ansi?的主要内容,如果未能解决你的问题,请参考以下文章

将 unicode 字符/字符串写入文件

为啥手机上不了百度网、只显示英文gateway received an invalid response from the upstream gateway

为啥 xlsxwriter 在我的单元格开头写 '

为啥我的约束不能正常工作?

为啥我的 C++ 文件无法运行 [重复]

为啥我要在发布到 PlayStore 之前签署我的 apk?