首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作std::wofstream写UTF-8?

如何制作std::wofstream写UTF-8?
EN

Stack Overflow用户
提问于 2016-08-17 10:47:43
回答 2查看 2.5K关注 0票数 2

我将std::wclog重定向到一个用于在程序中登录的文件:

代码语言:javascript
复制
std::wclog.rdbuf((new std::wofstream("C:\\path\\to\\file.log", std::ios::app))->rdbuf());

日志记录是通过写入std::wclog来实现的

代码语言:javascript
复制
std::wclog << "Schöne Grüße!" << std::endl;

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

(如果没有一种独立于平台的方式,我就在Win7+ 64位上。)

编辑:

上面的问题有一个错误。线

代码语言:javascript
复制
std::wclog << "Schöne Grüße!" << std::endl;

应该正确

代码语言:javascript
复制
std::wclog << L"Schöne Grüße!" << std::endl;

这只是为了演示我想要做的事情,在现实生活中,写到wofstreamwofstream来自一个提供翻译的类,如

代码语言:javascript
复制
std::wclog << _(L"Best regards") << std::endl;

哪里

代码语言:javascript
复制
#define _(X) i18n::translate(X)

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

因此,我想要做的是使用一个wstring将一个wofstring写到std::wclog中,并将它放入一个文件中,该文件应该是UTF-8编码的(没有BOM)。

EN

回答 2

Stack Overflow用户

发布于 2016-08-17 12:19:39

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

代码语言:javascript
复制
std::wclog << u8"Schöne Grüße!" << std::endl;

结果将是

舍恩·格鲁比斯!

如果您混合了ASCII和UTF8文本,例如:

代码语言:javascript
复制
std::wclog << "Schöne Grüße!" << std::endl << u8"Schöne Grüße!" << 

性病:endl;

非ASCII字符将被替换。

谢恩·格鲁! 舍恩·格鲁比斯!

Unicode文本被添加到C++ 11中,它们最初是在Visual 2015中实现的。字符串和字符文本页描述了目前在VisualC++中支持的文字。

票数 3
EN

Stack Overflow用户

发布于 2016-08-17 10:56:14

开放模式标志似乎没有提供这一点。

因为这与开放模式无关。

代码转换(即字符编码)由流使用的localelocale方面执行。您可以使用转换为UTF-8的codecvt方面向ostream注入不同的区域设置。

但我不知道这是否必要。我不知道Windows是如何工作的,但是在正常的平台上,您只需要编写包含UTF-8的窄字符串来阻塞,输出将是UTF-8,您不需要使用宽流。UTF-8是一种多字节编码,使用单八字节,即窄字符.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38994511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档