如何在Windows日语系统中打印日语字符?

时间:2019-02-12 10:48:37

标签: c++ c windows visual-studio cjk

我编写了一个小程序,该程序将日语字符串作为硬编码值,并将其写入日语系统中的文件中。该程序是用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时会显示为(?)

1 个答案:

答案 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

产生输出:

  

消息:スプールがいっぱいです

     

消息:スプールがいっぱいです