Unicode文字で英語混在文書の英語文字でMFC ANSIレコードの読み取りは、特異文字が文字化けします

  恥ずかしいが、C ++の三年以上の操作を行い、途中でまともなものの、Linuxはもっと前に一年以上行っているが、MFCはまた、同社の古いプロジェクトを維持してきた新しい何かを行っていない。、年以上作ら

  最近、いくつかのオンライン学習のビデオを探して、APIの下でおなじみのMFC、MFCの使用の制御下の見直しは、すべての後に、乾燥に騒ぎを食べるために男の気まぐれです。

  最近のパロディではメモ帳ソフトウェアは、基本的な機能を取るために始めてではなく、ラメ質問、MFCは、UNICODE文字セットで、ANSIテキストファイルをエンコードされたすべての中国の、何の問題を読んでいないが発生している、英語で問題なし、英語で混合されたときしかし、英語は数が奇数の場合、それは英語の文字の歪み、後にプログラムされます。

  その理由は、私は、マルチバイト文字列を読み取ることで、ANSIエンコードされたテキストファイルを読み込むこと、単純すぎると思うし、次のコードを持っているということです。

  私たちは、コードもコピーされ、これらの2を与え、明確に説明説明しなければならない場合は、コードのパラメータは、のCFileオブジェクトと開かれた読み取り専用、個人​​的な習慣を定義します。

  CFileファイル。
  file.Open(szFile、のCFile :: modeRead)。

1  空隙 CNotepadDlg :: ReadAnsi(のCFile・ファイル)
 2  {
 3      file.Seek(0 、のCFile ::開始)。
4      チャーバフ[ 1024 ]。
5      UINT nRet = 0 6      CStringのSTR。
7  
8      しばらく(nRet = file.Read(バフ、はsizeof(バフ- 1 )))
 9      {
 10          バフ[nRet] = ' \ 0 ' 11          STR + = バフ。
12      }
 13  
14     SetDlgItemText(IDC_EDIT_TEXT、STR)。
15  
16 }

  これは当然のシングルバイトの読み取りも、表示された問題によるものです。

  これは、ANSIエンコードされたテキスト文書を開くにはメモ帳です。

 

 

   これは、テキストドキュメントを開くために、私のパロディのメモ帳です

 

 

  結果は、右明白です。

  (これらの方法が試され、私はレベルの悪い、本当に理解していなかった可能性があり、最終的には最も原始的MultiByteToWideCharの、インターネットにも取り組み、A2T、bstr_t、_tsetlocale(LC_ALL、_T(「CHS」))をたくさん見つけます)問題を解決しました。もちろん、コードはまだ多くの問題を最適化することにします。

  

 1 void CMFC194Dlg::ReadAnsi(CFile& file)
 2 {
 3     file.Seek(0, CFile::begin);
 4     // TODO: 在此处添加实现代码.
 5     char buff[1024];
 6     UINT nRet = 0;
 7     CString str;
 8     
 9     LONGLONG nLen = file.GetLength();
10     char* p = new char[nLen + 1];
11     nLen = file.Read(p, nLen);
12     p[nLen] = '\0';
13     TCHAR* pText = new TCHAR[nLen + 2];
14     memset(pText,0 , nLen + 2);
15 
16     nLen = MultiByteToWideChar(CP_ACP, NULL, p, -1, pText, nLen + 2);
17 
18     SetDlgItemText(IDC_EDIT_TEXT, pText);
19 
20     delete[]p;
21     delete[]pText;
22 }

  读取结果:

 

  处理这个问题的灵魂是这两句代码:

  TCHAR* pText = new TCHAR[nLen + 2];

  memset(pText,0 , nLen + 2);

  因为 ANSI 编码中英文字母占一个字节,中文汉字占两个字节,所以定义 pText 长度不能是 多字节长度 / 2 + 2,这会导致空间不足,使 MultiByteToWideChar() 返回 0,用 GetLastError() 可知返回122。

おすすめ

転載: www.cnblogs.com/SmallAndGreat/p/12194651.html