如何将Unicode CString(日语)打印到文本文件?

时间:2012-08-31 00:34:51

标签: c++ file unicode mfc wofstream

对我来说,这对我来说似乎很艰难。我有这个代码将CString打印到文本文件,但值恰好是Unicode(日语)。一旦这条线被击中,它下面的任何其他东西都不会被打印出来。

任何想法如何在文本文件中打印日文文本?

#define OFSTREAM std::wofstream

OFSTREAM *outfile;
outfile = new OFSTREAM;
outfile->open (filename, ios::out);

CString varName = _T(" ");
/*stuff*/
*outfile << _T("  Name: ") << (LPCTSTR)varName << _T("\n");

3 个答案:

答案 0 :(得分:2)

流停止工作的原因是因为失败位已设置。您没有处理错误,因此流停止工作。发生错误时,需要清除失败位。

必须设置wostream对象上的语言环境,以便codecvt facet处理将日语宽字符转换为字节。默认情况下,使用“C”语言环境,VS中仅支持ASCII字符。如果您只需要将文件写入日语版本的Windows,则可以执行以下操作:

std::wofstream outfile(filename, ios::out);
outfile.imbue(std::locale("")); // use the system locale

CString varName = _T(" ");
/*stuff*/
outfile << L"  Name: " << (LPCTSTR)varName << L"\n";

或者您可以在Windows上指定日语区域设置:

outfile.imbue(std::locale("Japanese")); // use the japanese locale on any Windows system

这两种方法都使用传统的日语语言环境编码,这应该是可以避免的。您可以使用UTF-8:

// replace just the codecvt facet of the stream's current locale
outfile.imbue(std::locale(outfile.getloc(), new std::codecvt_utf8_utf16<wchar_t>()));

答案 1 :(得分:1)

通过Unicode,在这种情况下你可能意味着UTF16。根据您用来查看文件的编辑器,您可能需要在文件的开头放置一个字节顺序标记(BOM),因此编码和字节顺序是正确猜测的。否则,您需要在查看文件时明确设置编码。

但是,您的问题表明您在文件中的日文文本之前有文本。如果你把它作为非宽字符串,那就是问题。不要混。如果所有文本都很宽,您可能只是缺少在所选编辑器中显示日文字符的可能性,或者没有在Windows中安装对亚洲语言的支持。

Firefox通常很好地支持外来人物。将文件拖到那里,检查编码并看看你得到了什么。

答案 2 :(得分:0)

如果您使用的是Visual Studio,请转到C ++项目设置并将语言选项设置为使用Unicode而不是ANSI。然后Visual Studio将自动定义宏UNICODE和_UNICODE,您不应自己定义它们。您可能希望调用setlocale,以便VC ++库将内存中的Unicode字符串转换为文本文件中的多字节ANSI字符串,而不是在第一个非ASCII字符后丢失所有内容。

如果你正在使用MFC的其他编译器,那么我猜你必须自己定义宏UNICODE和_UNICODE,我不知道你还需要做什么。

如果您希望文本文件包含Unicode而不是多字节ANSI,那么您不希望VC ++库转换它们,但您必须做其他事情。请查看MSDN页面wofstream的社区内容部分。