第二次遇到這個問題了,搞了幾個小時,真是可惡。

從UNICODE 文本中讀取文本信息,怎么的顯示都是亂碼,連著試驗了好多種讀的方法都不對,最后發現讀出來的數據是正確的,在解析的時候出錯了。我使用了wcstombs()這個函數,可是每次轉換之后它返回的值都是-1。

原因在于,代碼頁沒有進行設置。需要調用locale.h 中定義的一個函數設置默認的代碼頁。貼點代碼放在這里,下次別忘了。

 HANDLE hFile;
 BYTE   buffer[1024]={0};
 WCHAR  wchbuffer[1024];
 char   chbuffer[1024],chmsg[1024];
 DWORD  dwNeedRead=1024;
 DWORD  dwRead=0;
 int    nRet;
 FILE *fp;
 hFile=CreateFile("unicode1.txt",GENERIC_READ,NULL,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
 if(hFile==INVALID_HANDLE_VALUE){
  MessageBox("CreateFile() fail","Error",0);
  return;
 }
 nRet=ReadFile(hFile,buffer,2,&dwRead,NULL); // Unicode 標志 0xFFFE
 if((!nRet)||2!=dwRead){
  MessageBox("ReadFile() Read first two byte fail","Error",0);
  CloseHandle(hFile);
  return;
 }
 else  MessageBox("ReadFile() Read first two byte OK","debug ",0);

 nRet=ReadFile(hFile,buffer,dwNeedRead,&dwRead,NULL);
 if(!nRet){
  MessageBox("ReadFile() fail","Error",0);
  CloseHandle(hFile);
  return;
 }

 memcpy(wchbuffer,buffer,1024);
 _tsetlocale(LC_ALL,_T(""));//設置代碼頁
 nRet=wcstombs(chbuffer,wchbuffer,sizeof(wchbuffer));
 if(nRet==1) {
  sprintf(chmsg,"wcstombs changed :%d Error:%d",nRet,GetLastError());
  MessageBox(chmsg,"debug",0);
 }

要讀所有內容的話,還需要處理。