c++ - 如何使 std::wofstream 写入 UTF-8?

标签 c++ logging utf-8 widechar

我将 std::wclog 重定向到一个文件以登录我的程序:

std::wclog.rdbuf((new std::wofstream("C:\\path\\to\\file.log", std::ios::app))->rdbuf());

通过写入 std::wclog 进行记录:

std::wclog << "Schöne Grüße!" << std::endl;

令人惊讶的是,我发现该文件是用 ANSI 编写的。 (这对于 ofstreamclog 来说是完全可以接受的,但我原以为 wofstreamwclog 会产生某种类型的结果。 unicode 输出。)我也希望能够登录 CYK 语言(例如用户输入),所以有没有办法让 wofstream 生成 UTF-8? openmode 标志似乎没有提供此功能。

(如果没有平台无关的方式,我使用的是Win7+ 64位。)

编辑:

上面的问题有一个错误。该行

std::wclog << "Schöne Grüße!" << std::endl;

应该是正确的

std::wclog << L"Schöne Grüße!" << std::endl;

这只是为了演示我想做的事情,在现实生活中,写入 wofstreamwstring 来自提供翻译的类,例如

std::wclog << _(L"Best regards") << std::endl;

哪里

#define _(X) i18n::translate(X)

class i18n {
public:
    static std::wstring translate(const std::wstring&);
}

所以我想做的是使用 wofstringwstring 写入 std::wclog 并将其放入文件中,该文件应该是 UTF-8 编码(无 BOM)。

最佳答案

您所需要的只是使用 UTF8 文字,即:

std::wclog << u8"Schöne Grüße!" << std::endl;

结果将是

Schöne Grüße!

如果混合使用 ASCII 和 UTF8 文字,例如:

std::wclog << "Schöne Grüße!" << std::endl << u8"Schöne Grüße!" << 

std::endl;

非 ASCII 字符将被替换。

Sch?ne Gr??e!
Schöne Grüße!

Unicode 文字已添加到 C++ 11。它们首先在 Visual Studio 2015 中实现。String and Character Literals page描述目前 Visual C++ 支持的文字。

关于c++ - 如何使 std::wofstream 写入 UTF-8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38994511/

相关文章:

c++ - Visual C++ 6初学者教程

c++ - 无法与 libcurl 链接 - 对多个函数的 undefined reference

c++ - 在 C++ 上使用递归函数计算幂

node.js - fs.write 仅在关闭服务器后注册

c++ - 使用固定编码的字符串到字节序列的转换,最好是 UTF-8

c# - 在 C# 项目中使用 OpenH264 DLL

javascript - 如何获取 Node.js 可写流的大小(HTTP 服务器响应)

java - 如何记录/跟踪java中对象的任何方法调用

python - 如何在允许 utf-8 输入的同时获得交互式 Python 以避免使用 readline?

俄语 HTML