日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

字符集之间转换(UTF-8,UNICODE,Gb2312) c++

發(fā)布時間:2024/4/17 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符集之间转换(UTF-8,UNICODE,Gb2312) c++ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
UTF-8: ? 3字節(jié)一個字符
UNICODE: 2字節(jié)一個字符
GB2312: ?1字節(jié)一個字符

例子:

“你”字的UTF-8編碼: E4 BD A0        11100100 10111101 10100000
“你”的Unicode編碼: 4F 60          ? 01001111 01100000
按照UTF-8的編碼規(guī)則,分解如下:xxxx0100 xx111101 xx100000
把除了x之外的數(shù)字拼接在一起,就變成“你”的Unicode編碼了。
注意UTF-8的最前面3個1,表示整個UTF-8串是由3個字節(jié)構(gòu)成的。
經(jīng)過UTF-8編碼之后,再也不會出現(xiàn)敏感字符了,因為最高位始終為1。

類定義
class CChineseCode
{
? ?public:
? ? ?? static void UTF_8ToUnicode(wchar_t* pOut,char *pText); ?// 把UTF-8轉(zhuǎn)換成Unicode
? ? ?? static void UnicodeToUTF_8(char* pOut,wchar_t* pText); ?//Unicode 轉(zhuǎn)換成UTF-8
? ? ?? static void UnicodeToGB2312(char* pOut,wchar_t uData); ?// 把Unicode 轉(zhuǎn)換成 GB2312
? ? ?? static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 轉(zhuǎn)換成 Unicode
? ? ?? static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 轉(zhuǎn)為 UTF-8
? ? ?? static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 轉(zhuǎn)為 GB2312
};

類實現(xiàn)

void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText)
{
? ? char* uchar = (char *)pOut;

? ? uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F);
? ? uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F);

? ? return;
}

void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText)
{
? ? // 注意 WCHAR高低字的順序,低字節(jié)在前,高字節(jié)在后
? ? char* pchar = (char *)pText;

? ? pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4));
? ? pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6);
? ? pOut[2] = (0x80 | (pchar[0] & 0x3F));

? ? return;
}

void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData)
{
? ? WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL);
? ? return;
} ? ?

void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer)
{
? ? ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1);
? ? return ;
}

void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen)
{
? ? char buf[4];
? ? int nLength = pLen* 3;
? ? char* rst = new char[nLength];
? ?
? ? memset(buf,0,4);
? ? memset(rst,0,nLength);
? ?
? ? int i = 0;
? ? int j = 0; ? ??
? ? while(i < pLen)
? ? {
? ? ?? ?? ? //如果是英文直接復(fù)制就能
? ? ?? ?? ? if( *(pText + i) >= 0)
? ? ?? ?? ? {
? ? ?? ?? ?? ?? ?? ?rst[j++] = pText[i++];
? ? ?? ?? ? }
? ? ?? ?? ? else
? ? ?? ?? ? {
? ? ?? ?? ?? ?? ?? ?wchar_t pbuffer;
? ? ?? ?? ?? ?? ?? ?Gb2312ToUnicode(&pbuffer,pText+i);
? ? ?? ?? ?? ?? ?? ?
? ? ?? ?? ?? ?? ?? ?UnicodeToUTF_8(buf,&pbuffer);
? ? ?? ?? ?? ?? ?? ?
? ? ?? ?? ?? ?? ?? ?unsigned short int tmp = 0;
? ? ?? ?? ?? ?? ?? ?tmp = rst[j] = buf[0];
? ? ?? ?? ?? ?? ?? ?tmp = rst[j+1] = buf[1];
? ? ?? ?? ?? ?? ?? ?tmp = rst[j+2] = buf[2]; ? ?
? ? ?? ?? ?? ?? ?? ?
? ? ?? ?? ?? ?? ?? ?j += 3;
? ? ?? ?? ?? ?? ?? ?i += 2;
? ? ?? ?? ? }
? ? }
? ? rst[j] = ’’;

? ? //返回結(jié)果
? ? pOut = rst; ? ?? ?? ?? ?
? ? delete []rst; ?
? ?
? ? return;
}

void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen)
{
? ? char * newBuf = new char[pLen];
? ? char Ctemp[4];
? ? memset(Ctemp,0,4);

? ? int i =0;
? ? int j = 0;
? ?
? ? while(i < pLen)
? ? {
? ? ?? ?if(pText > 0)
? ? ?? ?{
? ? ?? ?? ?? ?? newBuf[j++] = pText[i++]; ? ?? ?? ?? ?? ?? ?? ?
? ? ?? ?}
? ? ?? ?else ? ?? ?? ?? ?? ?
? ? ?? ?{
? ? ?? ?? ?? ?? WCHAR Wtemp;
? ? ?? ?? ?? ?? UTF_8ToUnicode(&Wtemp,pText + i);
? ? ?? ?
? ? ?? ?? ?? ?? UnicodeToGB2312(Ctemp,Wtemp);
? ? ?? ?? ?
? ? ?? ?? ?? ?? newBuf[j] = Ctemp[0];
? ? ?? ?? ?? ?? newBuf[j + 1] = Ctemp[1];

? ? ?? ?? ?? ?? i += 3; ? ?
? ? ?? ?? ?? ?? j += 2; ?
? ? ?? ?}
? ? }
? ? newBuf[j] = ’’;
? ?
? ? pOut = newBuf;
? ? delete []newBuf;
? ?
? ? return;
} ?

轉(zhuǎn)載于:https://www.cnblogs.com/hcmfys/archive/2009/09/24/1573310.html

總結(jié)

以上是生活随笔為你收集整理的字符集之间转换(UTF-8,UNICODE,Gb2312) c++的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。