生活随笔
收集整理的這篇文章主要介紹了
utf-8编码的字符串转成unicode(ucs-4)编码的字符串
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本人第一篇原創(chuàng)博客,盡力把代碼注釋清楚,如有錯(cuò)誤之處,敬請(qǐng)指出
typedef unsigned int mfchar_t;// 無(wú)符號(hào)的4字節(jié),用于容納UCS-4的一個(gè)字符
typedef std::basic_string<mfchar_t> mfstring;// 自定義的UCS-4字符串// 把utf-8編碼的字符串轉(zhuǎn)換成UCS-4編碼的字符串
void DB_Mofify_Handler::utf8ToWS(const string& src, mfstring& dest)
{mfchar_t w = 0;mfchar_t err = '?';// 表轉(zhuǎn)碼錯(cuò)誤int bytes = 0; // 表剩余要處理的字節(jié)數(shù)for (size_t i = 0; i < src.length(); i++){unsigned char c = (unsigned char)src[i];if (c <= 0x7f) // <= 0x0111 1111(即127)的說(shuō)明是ascii碼{// 若bytes不為0,說(shuō)明出錯(cuò),因?yàn)閍scii碼的utf-8編碼只占一個(gè)字節(jié)if (bytes){dest.push_back(err); bytes = 0;}// 將字符壓入隊(duì)列dest.push_back((mfchar_t)c);}else if (c <= 0xbf) // <= 0x1011 1111,說(shuō)明是多字節(jié)的utf-8編碼的第2,3,4,5,6字節(jié){// 既然是2,3,4,5,6字節(jié),bytes必不為0,否則出錯(cuò)if (bytes){// 取出c的后六位,將w左移6位,做或預(yù)算,賦值給w,這樣w就融合了c的后6位w = ( (w << 6) | (c & 0x3f) );// 字節(jié)數(shù)減1,因?yàn)楸咀止?jié)已經(jīng)融合完畢bytes--;// 若后面沒(méi)有字節(jié)數(shù)了,說(shuō)明字節(jié)數(shù)融合完畢,成為一個(gè)完整的ucs-4的字符了,壓入隊(duì)列if (bytes == 0){dest.push_back(w);}}else{dest.push_back(err); // 出錯(cuò)}}else if (c <= 0xdf) // <= 0x1101 1111,說(shuō)明是2字節(jié)的utf-8編碼的第一個(gè)字節(jié){bytes = 1; // 標(biāo)記后面還有1個(gè)字節(jié),下面類似w = c & 0x1f; // 取出后5位,注意是賦值操作,所以w的高位都將賦值為0。然后將 w 與后面字節(jié)的后六位融合即可,下面類似}else if (c <= 0xef) // <= 0x1110 1111,說(shuō)明是3字節(jié)的utf-8編碼的第一個(gè)字節(jié){bytes = 2; w = c & 0x0f; // 取出后4位}else if (c <= 0xf7) // <= 0x1111 0111,說(shuō)明是4字節(jié)的utf-8編碼的第一個(gè)字節(jié){bytes = 3; w = c & 0x07; // 取出后3位}else if (c <= 0xfb) // <= 0x1111 1011,說(shuō)明是5字節(jié)的utf-8編碼的第一個(gè)字節(jié){bytes = 4;w = c & 0x03; // 取出后2位}else if (c <= 0xfd) // <= 0x1111 1101,說(shuō)明是6字節(jié)的utf-8編碼的第一個(gè)字節(jié){bytes = 5;w = c & 0x01; // 取出后1位}else // > 0x1111 1101的是出錯(cuò),因utf-8最多6個(gè)字節(jié){dest.push_back(err);bytes = 0;}}if (bytes) {dest.push_back(err);}
}
總結(jié)
以上是生活随笔為你收集整理的utf-8编码的字符串转成unicode(ucs-4)编码的字符串的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。