1

我正在尝试通过 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();

通过执行此代码将无法识别的内容写入文件,我使用的是 VS 2008。

4

2 回答 2

1

我不太了解在 C++ 中注入语言环境,但也许它不起作用,因为您正在尝试使用希腊语言环境编写西里尔字符?

于 2012-04-12T09:23:01.253 回答
1

如果您std::locale("Russian")使用 VS2008,文件将被编码为“西里尔文 (Windows)”(而不是某些 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/

于 2012-04-12T10:08:39.673 回答