[英]How to make std::wofstream write UTF-8?
我正在将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编写的。 (这对于ofstream
和clog
来说是完全可以接受的,但我原本wofstream
和wclog
会产生某种类型的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;
这只是为了演示我想要做什么,在现实生活中,写入wofstream
的wstring
来自一个提供翻译的类,比如
std::wclog << _(L"Best regards") << std::endl;
哪里
#define _(X) i18n::translate(X)
class i18n {
public:
static std::wstring translate(const std::wstring&);
}
所以我想要做的是使用wofstring
将一个wstring
写入std::wclog
,将其放入一个文件中,该文件应该是UTF-8编码的(没有BOM)。
您只需要使用UTF8文字,即:
std::wclog << u8"Schöne Grüße!" << std::endl;
结果将是
SchöneGrüße!
如果混合使用ASCII和UTF8文字,例如:
std::wclog << "Schöne Grüße!" << std::endl << u8"Schöne Grüße!" <<
的std :: ENDL;
非ASCII字符将被替换。
Sch?ne Gr ?? e!
SchöneGrüße!
Unicode文字被添加到C ++ 11.它们首先在Visual Studio 2015中实现。 字符串和字符文字页面描述了Visual C ++目前支持的文字。
openmode标志似乎没有提供这个。
因为它与openmode无关。
代码转换(即字符编码)由流使用的locale
的codecvt
方面执行。 您可以使用转换为UTF-8的codecvt facet为不同的语言环境灌输ostream。
但我不知道这是否必要。 我不知道Windows的行为如何,但是在理智的平台上你只需要编写包含UTF-8的窄字符串来阻塞,输出就是UTF-8,你不需要使用宽流。 UTF-8是使用单个八位字节的多字节编码,即窄字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.