我正在将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 langugages中也是如此(例如用户输入),所以是否有办法让wofstream
生成UTF-8? openmode标志似乎没有提供这个。
(如果没有与平台无关的方式,我在Win7 + 64位上。)
修改
上述问题中存在错误。这条线
std::wclog << "Schöne Grüße!" << std::endl;
应正确
std::wclog << L"Schöne Grüße!" << std::endl;
这只是为了展示我想要做的事情,在现实生活中,写入wstring
的{{1}}来自提供翻译的类,例如
wofstream
,其中
std::wclog << _(L"Best regards") << std::endl;
所以我想做的是使用#define _(X) i18n::translate(X)
class i18n {
public:
static std::wstring translate(const std::wstring&);
}
将wstring
写入std::wclog
将其放入文件中,该文件应采用UTF-8编码(无BOM) )。
答案 0 :(得分:3)
您只需要使用UTF8文字,即:
Collections.sort(activeConverstions, new Comparator<Conversation>() {
@Override
public int compare(Conversation o1, Conversation o2) {
return Long.compare(o2,getTime(), o1.getTime());
}
});
结果将是
SchöneGrüße!
如果混合使用ASCII和UTF8文字,例如:
std::wclog << u8"Schöne Grüße!" << std::endl;
的std :: ENDL;
将替换非ASCII字符。
Sch?ne Gr ?? e!
SchöneGrüße!
Unicode文字被添加到C ++ 11.它们首先在Visual Studio 2015中实现。String and Character Literals page描述了Visual C ++目前支持的文字。
答案 1 :(得分:0)
openmode标志似乎没有提供此功能。
因为它与openmode无关。
代码转换(即字符编码)由流使用的codecvt
的{{1}}方面执行。您可以使用转换为UTF-8的codecvt facet为不同的语言环境灌输ostream。
但我不知道是否有必要。我不知道Windows的行为如何,但是在理智的平台上你只需要编写包含UTF-8的窄字符串来阻塞,输出就是UTF-8,你不需要使用宽流。 UTF-8是使用单个八位字节的多字节编码,即窄字符。