【发布时间】:2019-09-04 04:14:54
【问题描述】:
我正在尝试使用 std::wofstream 将 unicode 字符写入文件,但 put 或 write 函数不写入任何字符。
示例代码:
#include <fstream>
#include <iostream>
int main()
{
std::wofstream file;
file.open("output.txt", std::ios::app);
if (file.is_open())
{
wchar_t test = L'й';
const wchar_t* str = L"фывдлао";
file.put(test);
file.write(str, sizeof(str));
file.close();
}
else
{
std::wcerr << L"Failed to open file" << std::endl;
}
std::cin.get();
return 0;
}
output.txt文件为空,执行代码后没有写入wchar/string,为什么?我做错了什么?
编辑: 更正代码:
#include <fstream>
#include <iostream>
int main()
{
std::wofstream file;
file.open("output.txt", std::ios::app);
if (file.is_open())
{
wchar_t test = L'й';
const wchar_t* str = L"фывдлао";
file.put(test);
if (!file.good())
{
std::wcerr << L"Failed to write" << std::endl;
}
file.write(str, 8);
file.close();
}
else
{
std::wcerr << L"Failed to open file" << std::endl;
}
std::cin.get();
return 0;
}
应用代码更正后,我看到了Failed to write,但我仍然不明白我需要做什么才能编写宽字符串和字符?
【问题讨论】:
-
FWIW:C++ 中的宽字符存在问题,AFAIK wchar_t 可能会导致它解决的更多问题。替代实现,如 QString,可能是更安全的选择。
-
QString?当然必须有一种方法可以使用标准库或本机 OS API 使用 unicode 吗?我只是从未遇到过以意想不到的方式工作的广泛版本的函数/对象的问题。 IE。宽版本的 offstream 处理
char而不是wchar_t这背后的逻辑是什么? -
@Frax
QString也是基于wchar_t。它的唯一优势是来自一个来源的稳定版本的 ABI。 -
@Deduplicator 一方面,QString 可以正确处理 UTF-8 并且开箱即用。一般来说,它是可移植的,而 wchar_t 则不是那么多,因为它在不同平台上具有不同的大小。我不确定它在实践中是如何工作的。关键是,cpp 标准几乎不能保证 wchar_t 是什么,而 QString 是非常具体的(即稳定的 ABI;实际上这是一个大问题)。
-
@Frax 对不起,我错了。 QString 是基于它们自己的 UTF-16 codeunit-class,而不是基于
wchar_t。