我将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语言(例如,用户输入),因此是否有一种方法可以让生成UTF-8? --开放模式标志似乎没有提供这种功能。
(如果没有一种独立于平台的方式,我就在Win7+ 64位上。)
编辑:
上面的问题有一个错误。线
std::wclog << "Schöne Grüße!" << std::endl;应该正确
std::wclog << L"Schöne Grüße!" << std::endl;这只是为了演示我想要做的事情,在现实生活中,写到wofstream的wofstream来自一个提供翻译的类,如
std::wclog << _(L"Best regards") << std::endl;哪里
#define _(X) i18n::translate(X)
class i18n {
public:
static std::wstring translate(const std::wstring&);
}因此,我想要做的是使用一个wstring将一个wofstring写到std::wclog中,并将它放入一个文件中,该文件应该是UTF-8编码的(没有BOM)。
发布于 2016-08-17 12:19:39
您所需要的只是使用UTF8文字,即:
std::wclog << u8"Schöne Grüße!" << std::endl;结果将是
舍恩·格鲁比斯!
如果您混合了ASCII和UTF8文本,例如:
std::wclog << "Schöne Grüße!" << std::endl << u8"Schöne Grüße!" << 性病:endl;
非ASCII字符将被替换。
谢恩·格鲁! 舍恩·格鲁比斯!
Unicode文本被添加到C++ 11中,它们最初是在Visual 2015中实现的。字符串和字符文本页描述了目前在VisualC++中支持的文字。
发布于 2016-08-17 10:56:14
开放模式标志似乎没有提供这一点。
因为这与开放模式无关。
代码转换(即字符编码)由流使用的locale的locale方面执行。您可以使用转换为UTF-8的codecvt方面向ostream注入不同的区域设置。
但我不知道这是否必要。我不知道Windows是如何工作的,但是在正常的平台上,您只需要编写包含UTF-8的窄字符串来阻塞,输出将是UTF-8,您不需要使用宽流。UTF-8是一种多字节编码,使用单八字节,即窄字符.
https://stackoverflow.com/questions/38994511
复制相似问题