如何在纯文本文件中保留日语字符? 我的C++程序是在VisualStudio 2010中构建的,Unicode选项打开了。该程序通过对话框收集CString数据,并将行写入纯文本(.TXT)文件。当我在十六进制编辑器中查看该文件时,它显然是使用16位编码编写的。但大多数情况下,写入文件的任何日语字符都会被转换为0x003E(一个问号),即使在配置为具有日语界面的Windows系统上也是如此。有时(这是我真正不理解的),我从客户那里得到的文件是正确编码的。所有字符均为16位;文件中的所有罗马字符的高字节均为0x00,但日语字符使用所有16位。这就是我一直希望发生的事情

如何在纯文本文件中保留日语字符? 我的C++程序是在VisualStudio 2010中构建的,Unicode选项打开了。该程序通过对话框收集CString数据,并将行写入纯文本(.TXT)文件。当我在十六进制编辑器中查看该文件时,它显然是使用16位编码编写的。但大多数情况下,写入文件的任何日语字符都会被转换为0x003E(一个问号),即使在配置为具有日语界面的Windows系统上也是如此。有时(这是我真正不理解的),我从客户那里得到的文件是正确编码的。所有字符均为16位;文件中的所有罗马字符的高字节均为0x00,但日语字符使用所有16位。这就是我一直希望发生的事情,c++,visual-studio-2010,C++,Visual Studio 2010,当我收到这些文件时,我通常使用TextWrangler在Mac(OS X 10.10.3)上显示它们。当我告诉TextWrangler使用Shift JIS编码打开它们时,好的看起来很好。但我从日本收到的大多数照片中,日文字符应该出现的地方都有问号 我可以做些什么来确保在编写文件时不会破坏日文字符 另外,我知道从dialog类中获取的CString数据很好。其中一些是使用AfxGetApp()->WriteProfileString()存储的,它们很好;我能把它们拿回来,所有的日本人仍然是日本

当我收到这些文件时,我通常使用TextWrangler在Mac(OS X 10.10.3)上显示它们。当我告诉TextWrangler使用Shift JIS编码打开它们时,好的看起来很好。但我从日本收到的大多数照片中,日文字符应该出现的地方都有问号

我可以做些什么来确保在编写文件时不会破坏日文字符


另外,我知道从dialog类中获取的CString数据很好。其中一些是使用
AfxGetApp()->WriteProfileString()
存储的,它们很好;我能把它们拿回来,所有的日本人仍然是日本人


下面是我用来编写TXT文件的一些代码:

FILE    *f;
f   =   _tfopen(fullpath, _T("w"));
if (!f)
{
    SAY(_T("File creation error"));
    return;
}
_ftprintf(f, _T("%s\n"), m_3);
_ftprintf(f, _T("%s\n"), m_4);
_ftprintf(f, _T("%s\n"), m_5);
fclose(f);

这是相当普通的代码
MU 3
MU 5
这里是Cstring变量,绝对是wchar\t。我的数据在哪里被破坏?我能做些什么?

您确定代码中定义了UNICODE吗?你试过fwprintf吗?是的,UNICODE是明确定义的,而且_ftprintf是一个映射到fwprintf的宏。毫无疑问,我写的是16位字符。如果调试应用程序,缓冲区在内存中是什么样子的?缓冲区包含正确的Unicode字符,例如:b4 30 b8 30 e9 30。(小endian)UNICODE和UNICODE之间有区别。后者用于运行时库,这是
\u ftprintf
的来源。在某种程度上,至少对您的一些用户来说,代码页正在发挥作用。对于其他人,您得到的是UTF-16。您确定您的代码中定义了UNICODE吗?你试过fwprintf吗?是的,UNICODE是明确定义的,而且_ftprintf是一个映射到fwprintf的宏。毫无疑问,我写的是16位字符。如果调试应用程序,缓冲区在内存中是什么样子的?缓冲区包含正确的Unicode字符,例如:b4 30 b8 30 e9 30。(小endian)UNICODE和UNICODE之间有区别。后者用于运行时库,这是
\u ftprintf
的来源。在某种程度上,至少对您的一些用户来说,代码页正在发挥作用。对于其他人,您将获得UTF-16。