我编写了一个小程序,该程序将日语字符串作为硬编码值,并将其写入日语系统中的文件中。该程序是用Visual Studio 2010(英语系统)编写的。
char szMsg_m[]="スプールがいっぱいです"; //input
string szMsg_s=("スプールがいっぱいです");
wchar_t szMsg_w[]=L"スプールがいっぱいです";
wstring szMsg_h=L"スプールがいっぱいです";
fprintf (trace.TraceFP, "\tMsg:%s \n", szMsg_m); //output
fprintf (trace.TraceFP, "\tMsg:%s \n", szMsg_s.c_str());
fwprintf (trace.TraceFP, L"\tMsg:%s \n", szMsg_w);
fwprintf (trace.TraceFP, L"\tMsg:%s \n", szMsg_h.c_str());
输出应该是日语,为什么在日语系统中运行exe时会显示为(?)
答案 0 :(得分:2)
正如 user694733 所指出的,您丢失了std::locale::global (std::locale ("en_US.UTF-8"));
。我测试了以下内容:
#include <iostream>
#include <string>
#include <cstdio>
int main()
{
std::locale::global (std::locale ("en_US.UTF-8"));
char szMsg_m[]="スプールがいっぱいです"; //input
std::string szMsg_s=("スプールがいっぱいです");
fprintf (stdout, "\tMsg:%s \n", szMsg_m); //output
fprintf (stdout, "\tMsg:%s \n", szMsg_s.c_str());
return 0;
}
产生输出:
消息:スプールがいっぱいです
消息:スプールがいっぱいです
如果没有更多信息,我无法告诉您的是代码中的trace.TraceFP
是什么,以及如何使用它。
以下内容也有效:
{
std::locale::global (std::locale ("en_US.UTF-8"));
wchar_t szMsg_w[]=L"スプールがいっぱいです";
std::wstring szMsg_h=L"スプールがいっぱいです";
fwprintf (stdout, L"\tMsg:%ls \n", szMsg_w);
fwprintf (stdout, L"\tMsg:%ls \n", szMsg_h.c_str());
}
请注意,宽字符串的正确格式为%ls
。
产生输出:
消息:スプールがいっぱいです
消息:スプールがいっぱいです