自己動手豐衣足食-搞定網頁亂碼 (轉)

gugu99發表於2008-05-26
自己動手豐衣足食-搞定網頁亂碼 (轉)[@more@]

朋友發過來的信件,全都是

Hi, Sorry for writing back late.
資料丟了就丟了吧,以後小心點就ą

59;了,你應該把那些重要的東東刻下

這個樣子,怎麼辦?讓他重寫,估計誰也沒有這個耐心,只好自己捉摸一下了。

判定問題:看這段文字可以猜出每個xxxx;都是一個字元的某種編碼,在上搜了一把,果然發現這些都是unicode碼。

分析問題:unicode無非就是2個位元組一個字元,所以只要將這些unicode碼當作16位數存在一個寬字元快取中,顯示就行了。
  還要考慮一般顯示字元都要轉換成mutibyte方式,所以還要用個:WCharToMultiByte。
 
實現:  code + de --&gt ok! 朋友的長信被“”了。

現在和大家分享快樂(沒有,不好意思了):

#define _UNICODE  // IMPORTANT!!

// convert from one wide char to mutibyte char[]
char* Convert( wchar_t wc, char* lpDest )
{
  // construct wchar string
 wchar_t strScr[2];
 strScr[0] = wc;
 strScr[1] = L'';

 // lpDest must a char string with 3 byte, and lpDest[2] == ''
 assert( 0 == lpDest[2] );

 int iRet = WideCharToMultiByte(
 CP_ACP, // codepage
 0, // dwFlags
 strScr, // lpWideCharStr
 -1, // cchWideChar
 lpDest, // lpMutiByteStr
 3, // cchMutiByte
 NULL, // lpDefaultChar
 NULL  // lpUsedDefaultChar
  );

 int iError = GetLastError();
 switch(iError)
 {
 case ERROR_INSUFFICIENT_BUFFER:
 break;
 case ERROR_INVALID_FLAGS:
 break;
 case ERROR_INVALID_PARAMETER:
 break;
 default:
 return lpDest;
 }
 return NULL;
}

// from unicode string to normal string
CString ParseConvert( CString& szSrc )
{
 CString szDest = "";

 int cLength = szSrc.GetLength();
 char cDestChar[] = "??";
 for( int i=0 ; i < cLength; i ++ )
 {
 if( szSrc[i] == '&' && szSrc[i+1] == '#' )  // a unicode char start
 {
 int iCount = 0;
 char szWC[10] ;
 memset( szWC, 0, 10 );
 i += 2;
 while( szSrc[i] != ';' )
 {
 szWC[iCount] = szSrc[i];
 iCount++;
 i++;
 }
 int wc = 0;
 sscanf( szWC, "%d", &wc );
 szDest += Convert( wc, cDestChar );
 }
 else
 {
 szDest += szSrc[i];
 }
 }
 return szDest;
}

void CDecodeDlg::OnButton1()
{
 CFileDialog dlg(TRUE);
 CString szFileName;
 if( dlg.odal() == IDOK )
 {
 szFileName = dlg.GetPathName();
 }
 else
 return;

 CStdioFile file;
 file.Open( szFileName, CFile::modeRead | CFile::typeText );

 CString szBuf, szLine;

 while( file.ReadString( szLine ) )
 {
 szBuf += szLine;
 szBuf += "n";
 }
 file.Close();

  // try it
 MessageBox( ParseConvert( szBuf ) );

}

to:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-1004596/,如需轉載,請註明出處,否則將追究法律責任。

相關文章