无法从文件中读取unicode(japanese)

SPS*_*PSN 2 c++ internationalization character-encoding cjk

嗨,我有一个包含日文文本的文件,保存为unicode文件.

我需要从文件中读取并将信息显示到标准输出.

我正在使用Visual Studio 2008

int main()   
{  
      wstring line;  
      wifstream myfile("D:\sample.txt"); //file containing japanese characters, saved as unicode file  
      //myfile.imbue(locale("Japanese_Japan"));  
      if(!myfile)  
            cout<<"While opening a file an error is encountered"<<endl;  
      else  
            cout << "File is successfully opened" << endl;  
      //wcout.imbue (locale("Japanese_Japan"));  
      while ( myfile.good() )  
      {  
            getline(myfile,line);  
            wcout << line << endl;  
      }  
      myfile.close();  
      system("PAUSE");  
      return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

该程序生成一些随机输出,我在屏幕上看不到任何日文文本.

bdo*_*lan 5

好家伙.欢迎来到有趣,有趣的角色编码世界.

您需要知道的第一件事是您的控制台不是Windows上的unicode.在控制台应用程序中看到日文字符的唯一方法是将非Unicode(ANSI)区域设置为日语.这也会使反斜杠看起来像日元符号和包含欧洲重音字符的中断路径使用ANSI Windows API(当Windows XP出现时应该被弃用,但人们仍然使用到今天...)

所以你要做的第一件事就是构建一个GUI程序.但我会把它作为一个练习留给感兴趣的读者.

其次,有很多方法来表示文本.首先需要弄清楚正在使用的编码.是UTF-8吗?UTF-16(如果是这样,小端或大端?)Shift-JIS?EUC-JP?wstream如果文件是little-endian UTF-16,则只能使用a 直接读取.即便如此,你需要使用其内部缓冲区.除了UTF-16之外的任何东西,你都会得到难以理解的垃圾.这也是Windows上的情况!其他操作系统可能具有不同的wstream表示.最好不要wstream真的使用s.

所以,我们假设它不是 UTF-16(完全通用).在这种情况下,您必须将其作为字符串流读取 - 而不是使用wstream.然后,您必须将此字符串转换为UTF-16(假设您正在使用Windows!其他操作系统倾向于使用UTF-8 char*).在Windows上,这可以完成MultiByteToWideChar.确保传入正确的代码页值,CP_ACP或者CP_OEMCP几乎总是错误的答案.

现在,您可能想知道如何确定哪个代码页(即字符编码)是正确的.简短的回答是你没有.没有初步的方法来查看文本字符串并说明它是哪种编码.当然,可能会有提示 - 例如,如果你看到一个字节顺序标记,很可能是unicode的任何变体都会产生这种标记.但一般来说,你必须被用户告知,或者试图猜测,如果你错了就依赖用户来纠正你,或者你必须选择一个固定的字符集并且不要试图支持任何其他.