UTF8 到GB2312 的 轉換

這段代碼不僅僅是含有UTF8到Unicode的轉換,還包括Gb2312,Unicode 到Gb2312 如過不使用Windows API的話,那麼自己因該建立一個轉化表,這樣效率纔會好,因爲我一時沒有找到這種表。如果誰有請貼上來。謝謝。


#include <string.h>
#include 
<tchar.h>
using namespace std;
int GetNo(char ch)
{
    
int i = 0;
    
while (ch & 0x80)
    
{
        
++i;
        ch 
<<= 1;
    }

    
return i == 0 ? 1 : i;
}

void UTF8ToUnicode(const char *pUtf8, char *pUnicode, int nBytes)
{
    
switch (nBytes)
    
{
    
case 1:
        
*pUnicode = *pUtf8;
        pUnicode 
+= 1;
        
break;
    
case 2:  
        
*pUnicode = ((*(pUtf8 + 1)) & 0x3<< 6 | (*pUtf8) & 0x3f;
        
*(pUnicode + 1= ((*pUtf8) & 0x1f>> 2;
        pUnicode 
+= 2;
        
break;
    
case 3:
        
*pUnicode = ((*(pUtf8 + 1)) & 0x3<< 6 | ((*(pUtf8 + 2)) & 0x3f);
        
*(pUnicode + 1= ((*pUtf8) & 0xf<< 4 | (((*(pUtf8 + 1)) & 0x3f>> 2);
        pUnicode 
+= 2;

        
break;
    
default:
        
break;
    }

    
*pUnicode = '';
}


int  UnicodeToGB2312(char *pUnicode, char *pGb2312, int nBytes)
{
    
int nMultiBytes =::WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (LPCWSTR)(pUnicode), -1,
        pGb2312, 
0, NULL, NULL);

    
if (nMultiBytes >= nBytes)
        
return -1;

    
int nError = ::WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, (LPCWSTR)(pUnicode), -1,
        pGb2312, nBytes, NULL, NULL);

    
if (nError == 0)
        
return -1;

    
return nMultiBytes - 1;
}


BOOL UTF8ToGb2312(
const char *pUtf8, char *pGb2312)
{
    
while (*pUtf8 != '')
    
{
        
int nBytes = GetNo(*pUtf8);
        TCHAR szUnicode[
5= {0};
        UTF8ToUnicode(pUtf8, szUnicode, nBytes);
        
        TCHAR szGb2312[
5= {0};
        
int nSize = UnicodeToGB2312(szUnicode, szGb2312, 
            
sizeof(szGb2312) - sizeof(szGb2312[0]));
        
if (nSize == -1 || nSize == 0)
        
{
            
return FALSE;
        }

        
        CopyMemory(pGb2312, szGb2312, nSize);
        pUtf8 
+= nBytes;        
        pGb2312 
+= nSize ;
    }

    
return TRUE;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章