1

这对我来说似乎是一个艰难的过程。我有这段代码可以将 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");
4

3 回答 3

2

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

必须设置 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>()));
于 2012-08-31T14:16:46.680 回答
1

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

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

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

于 2012-08-31T01:56:24.103 回答
0

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

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

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

于 2012-08-31T02:44:32.323 回答