繁体   English   中英

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

[英]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编写的。 (这对于ofstreamclog来说是完全可以接受的,但我原本wofstreamwclog会产生某种类型的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;

这只是为了演示我想要做什么,在现实生活中,写入wofstreamwstring来自一个提供翻译的类,比如

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无关。

代码转换(即字符编码)由流使用的localecodecvt方面执行。 您可以使用转换为UTF-8的codecvt facet为不同的语言环境灌输ostream。

但我不知道这是否必要。 我不知道Windows的行为如何,但是在理智的平台上你只需要编写包含UTF-8的窄字符串来阻塞,输出就是UTF-8,你不需要使用宽流。 UTF-8是使用单个八位字节的多字节编码,即窄字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM