任何想法如何在文本文件中打印日文文本?
#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");
答案 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的社区内容部分。