生活随笔
收集整理的這篇文章主要介紹了
c++字符集之间转换(UTF-8,UNICODE,Gb2312)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
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é)構成的。
經(jīng)過UTF-8編碼之后,再也不會出現(xiàn)敏感字符了,因為最高位始終為1。
類定義
class?CChineseCode{
public:static?void?UTF_8ToUnicode(wchar_t*?pOut,char?*pText);??//?把UTF-8轉換成Unicodestatic?void?UnicodeToUTF_8(char*?pOut,wchar_t*?pText);??//Unicode?轉換成UTF-8static?void?UnicodeToGB2312(char*?pOut,wchar_t?uData);??//?把Unicode?轉換成?GB2312?static?void?Gb2312ToUnicode(wchar_t*?pOut,char?*gbBuffer);//?GB2312?轉換成 Unicodestatic?void?GB2312ToUTF_8(string&?pOut,char?*pText,?int?pLen);//GB2312?轉為?UTF-8static?void?UTF_8ToGB2312(string?&pOut,?char?*pText,?int?pLen);//UTF-8?轉為?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){//如果是英文直接復制就能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]?=?’’;//返回結果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){if(?*(pText?+?i)?>=?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;?
}
轉載于:https://my.oschina.net/u/1426828/blog/552383
總結
以上是生活随笔為你收集整理的c++字符集之间转换(UTF-8,UNICODE,Gb2312)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。