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



这对我来说似乎很难。我有一段代码可以将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");

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

必须设置wostream对象上的区域设置,以便codecvt方面处理将日语宽字符转换为字节的操作。默认情况下,使用"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>()));

在这种情况下,Unicode可能指的是UTF16。根据用于查看文件的编辑器,您可能需要在文件的开头放置一个字节顺序标记(BOM),以便正确猜测编码和字节顺序。否则,在查看文件时需要显式设置编码。

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

Firefox通常非常支持外来字符。把文件拖到那里,检查编码,看看你得到了什么。

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

如果你在MFC中使用其他编译器,那么我想你必须自己定义UNICODE和_UNICODE这两个宏,我不确定你还需要做什么。

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

最新更新