如何让std :: wofstream写入UTF-8?

时间:2016-08-17 10:47:43

标签: 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 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) )。

2 个答案:

答案 0 :(得分:3)

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

Collections.sort(activeConverstions, new Comparator<Conversation>() {
    @Override
    public int compare(Conversation o1, Conversation o2) {
        return Long.compare(o2,getT‌​ime(), 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是使用单个八位字节的多字节编码,即窄字符。