我正试着用wfstream在文件中写一些俄文unicode文本。下面这段代码已经被使用过了。
wfstream myfile;
locale AvailLocale("Russian");
myfile.imbue(AvailLocale);
myfile.open(L"d:\\example.txt",ios::out);
if (myfile.is_open())
{
myfile << L"доброе утро" <<endl;
}
myfile.flush();
myfile.close();通过执行此代码,无法识别的内容被写入文件,我使用的是VS2008。
发布于 2012-04-12 17:23:01
我不太了解如何在C++中注入语言环境,但也许是因为您试图使用希腊语言环境来编写西里尔文字符,所以它不能正常工作?
发布于 2012-04-12 18:08:40
如果你使用std::locale("Russian"),那么当你使用VS2008时,文件将被编码为“西里尔字母(视窗)”(而不是某种Unicode格式)。例如,如果您使用Internet Explorer打开它,并将编码更改为西里尔文(Windows),则字符将变为可见。
更常见的是以某种Unicode格式存储文件。
当我使用:
const std::locale AvailLocale
= std::locale(std::locale("Russian"), new std::codecvt_utf8<wchar_t>());将其存储为UTF-8并打开文件,例如在记事本中作为UTF-8文件。它可以看到доброеутро
类似地,您可以使用codecvt_utf16或其他编码方案对unicode字符进行编码。
codecvt_utf8是特定于C++11的。
或者,你可以使用boost:http://www.boost.org/doc/libs/1_46_0/libs/serialization/doc/codecvt.html或者自己实现类似的东西(从http://www.boost.org/doc/libs/1_40_0/boost/detail/utf8_codecvt_facet.hpp上看,它看起来并不那么复杂)。
或者这个库:http://utfcpp.sourceforge.net/
https://stackoverflow.com/questions/10120775
复制相似问题