青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

Unicode和UTF-8之間的轉換詳解

ps. 轉的,代碼上有錯誤的,沒仔細看,只看了下思路思想,很不錯,特別鄙視那種死咬人家錯誤不放的人,嗎的,誰寫代碼沒個錯誤,誰能代碼一寫出來就不用改不用來回推敲. 人家目的是向你介紹思想,思想你明白了不就行了.
=======================================================
最近在用VC++開發一個小工具,平時用慣了.NET,用起VC++最郁悶的就是字符串 處理。當然最最讓人難于琢磨的就是字符集,編碼之間的轉換。通過這幾天的研究,終于明白了Unicode和UTF-8之間編碼的區別。Unicode是一 個字符集,而UTF-8是Unicode的其中一種,Unicode是定長的都為雙字節,而UTF-8是可變的,對于漢字來說Unicode占有的字節比 UTF-8占用的字節少1個字節。Unicode為雙字節,而UTF-8中漢字占三個字節。
                       
網魂小兵 http://xdotnet.cnblogs.com
    UTF-8編碼字符理論上可以最多到6個字節長,然而16位BMP(
Basic Multilingual Plane)字符最多只用到3字節長。下面看一下UTF-8編碼表:

        U-00000000 - U-0000007F: 0xxxxxxx
        U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
        U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
        U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
        U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
        U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


    xxx 的位置由字符編碼數的二進制表示的位填入, 越靠右的 x 具有越少的特殊意義,只用最短的那個足夠表達一個字符編碼數的多字節串。 注意在多字節串中, 第一個字節的開頭"1"的數目就是整個串中字節的數目。而第一行中以0開頭,是為了兼容ASCII編碼,為一個字節,第二行就為雙字節字符串,第三行為3 字節,如漢字就屬于這種,以此類推。(個人認為:其實我們可以簡單的把前面的1的個數看成字節數)
                         網魂小兵 http://xdotnet.cnblogs.com
    為了要將Unicode轉換為UTF-8,當然要知道他們的區別到底在什么地方。下面來看一下,在Unicode中的編碼是怎樣轉換成UTF-8的,在UTF-8中,如果一個字符的字節小于0x80(128)則為ASCII字符,占一個字節,可以不用轉換,因為UTF-8兼容ASCII編碼。假如在Unicode中漢字“你”的編碼為“u4F60”,把它轉換為二進制為100111101100000,然后按照UTF-8的方法進行轉換。可以將Unicode二進制從地位往高位取出二進制數字,每次取6位,如上述的二進制就可以分別取出為如下所示的格式,前面按格式填補,不足8位用0填補。

      
           unicode:  100111101100000                  4F60

           utf-8:    11100100,10111101,10100000       E4BDA0


    從上面就可以很直觀的看出Unicode到UTF-8之間的轉換,當然知道了UTF-8的格式后,就可以進行逆運算,就是按照格式把它在二進制中的相應位置上取出,然后在轉換就是所得到的Unicode字符了(這個運算可以通過“位移”來完成)。
                     
網魂小兵 http://xdotnet.cnblogs.com
    如上述的“你”的轉換,由于其值大于0x800小于0x10000,因此可以判斷為三字節存儲,則最高位需要向右移“12”位再根據三字節格式的最高位為 11100000(0xE0)求或(|)就可以得到最高位的值了。同理第二位則是右移“6”位,則還剩下最高位和第二位的二進制值,可以通過與 111111(0x3F)求按位于(&)操作,再和11000000(0x80)求或(|)。第三位就不用移位了,只要直接取最后六位(與 111111(ox3F)取&),在與11000000(0x80)求或(|)。OK了,轉換成功!在VC++中的代碼如下所示(Unicode到UTF-8的轉換)。

        1 const wchar_t pUnicode = L"";
        2 char utf8[3+1];
        3 memset(utf8,0,4);
        4 utf8[0= 0xE0|(pUnicode>>12);
        5 utf8[1= 0x80|((pUnicode>>6)&0x3F);
        6 utf8[2= 0x80|(pUnicode&0x3F);
        7 utf8[3= "\0";
        8 //char[4]就是UTF-8的字符“你”了。

    當然在UTF-8到Unicode的轉換也是通過移位等來完成的,就是把UTF-8那些格式相應的位置的二進制數給揪出來。在上述例子中“你”為三個字節,因此要每個字節進行處理,有高位到低位進行處理。在UTF-8中“你”為
11100100,10111101,10100000。從高位起即第一個字節11100100就是把其中的"0100"給取出來,這個很簡單只要和11111(0x1F)取與(&),由三字節可以得知最到位肯定位于12位之前,因為每次取六位。所以還要將得到的結果左移12位,最高位也就這樣完成了0100,000000,000000。而第二位則是要把“111101”給取出來,則只需將第二字節10111101 和111111(0x3F)取與(&)。在將所得到的結果左移6位與最高字節所得的結果取或(|),第二位就這樣完成了,得到的結果為 0100,111101,000000。以此類推最后一位直接與111111(0x3F)取與(&),再與前面所得的結果取或(|)即可得到結果 0100,111101,100000。OK,轉換成功!在VC++中的代碼如下所示(UTF-8Unicode的轉換)。

    1 //UTF-8格式的字符串
    2 const char* utf8 = "";
    3 wchar_t unicode;
    4 unicode = (utf8[0& 0x1F<< 12;
    5 unicode |= (utf8[1& 0x3F<< 6;
    6 unicode |= (utf8[2& 0x3F);
    7 //unicode is ok!
                            網魂小兵 http://xdotnet.cnblogs.com
    當然在編程過程中不可能只轉換一個字符,這里需要注意的是字符的長度一定要算清楚,不然會帶來...以上就是我這幾天研究的結果,至于Unicode的轉換為GB2312在MFC中Windows有自帶的API(WideCharToMultiByte)可以轉換。這樣也就能夠將UTF-8格式轉換為GB2312了,這里就不再贅述,如果大家有更好的方法希望指教。

posted on 2012-07-18 14:50 多彩人生 閱讀(191) 評論(0)  編輯 收藏 引用

導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            99精品视频一区| 欧美视频不卡中文| 一区二区三区免费看| 一本在线高清不卡dvd| 亚洲美女淫视频| aa亚洲婷婷| 亚洲欧美一区二区视频| 欧美在线视屏| 老妇喷水一区二区三区| 欧美国产第一页| 国产精品啊啊啊| 国产女人精品视频| 亚洲国产精品www| 午夜精品美女久久久久av福利| 国产精品亚洲综合天堂夜夜| 国产欧美一区二区在线观看| 亚洲第一页在线| 亚洲色图制服丝袜| 久久视频一区| 一本色道久久综合狠狠躁篇的优点| 91久久精品国产91性色| 亚洲性图久久| 久久综合影音| 99天天综合性| 久久综合激情| 国产精品一区二区三区免费观看| 亚洲成在人线av| 久久se精品一区精品二区| 亚洲福利视频免费观看| 亚洲无线视频| 欧美黄色影院| 狠狠色噜噜狠狠色综合久| 亚洲性人人天天夜夜摸| 欧美大片一区二区三区| 亚洲永久免费视频| 欧美日韩精品欧美日韩精品一| 国产伪娘ts一区| 午夜精品久久久久久久久久久| 亚洲国产日韩欧美在线图片| 欧美一区二区高清| 国产精品一区二区欧美| 亚洲深夜av| 亚洲承认在线| 久久婷婷蜜乳一本欲蜜臀| 国产精品日韩在线观看| 亚洲视频国产视频| 亚洲国产一区视频| 美女被久久久| 亚洲欧洲日本一区二区三区| 欧美aaa级| 久久亚洲欧美| 亚洲丁香婷深爱综合| 久久久久久久久综合| 亚洲一区区二区| 国产精品国产三级国产普通话蜜臀| 亚洲精品国产无天堂网2021| 欧美国产日本韩| 久久综合五月天婷婷伊人| 国产综合色在线| 久久久久亚洲综合| 午夜欧美大尺度福利影院在线看 | 亚洲欧美日韩人成在线播放| 欧美日韩国产黄| aaa亚洲精品一二三区| 亚洲第一页中文字幕| 久久综合久色欧美综合狠狠| 一区三区视频| 亚洲电影第1页| 欧美日韩精品免费看| 亚洲一级二级在线| 亚洲一区二区三区高清不卡| 国产精品日韩久久久久| 欧美伊人久久久久久久久影院| 亚洲专区一区二区三区| 国产在线精品成人一区二区三区| 久久野战av| 欧美承认网站| 亚洲一区在线观看视频| 午夜久久久久| 91久久精品www人人做人人爽| 国产手机视频一区二区| 久久久噜噜噜久久| 欧美高清视频一区二区三区在线观看| 亚洲精品中文字幕在线| 亚洲精品一二区| 国产美女搞久久| 鲁大师影院一区二区三区| 欧美成人免费播放| 亚洲欧美激情一区二区| 久久成人18免费网站| 亚洲久久一区二区| 亚洲欧美日韩精品一区二区| 亚洲大黄网站| 亚洲一区二区免费看| 在线观看视频一区二区欧美日韩| 亚洲国产高清自拍| 国产精品美女999| 女人天堂亚洲aⅴ在线观看| 欧美国产精品中文字幕| 久久国产高清| 欧美日韩一区二区免费视频| 久久综合给合| 国产精品护士白丝一区av| 美女视频网站黄色亚洲| 国产精品高潮呻吟久久av无限 | 国产精品久久久99| 欧美电影免费| 国产精品入口尤物| 欧美国产大片| 国产偷国产偷精品高清尤物| 日韩亚洲欧美一区二区三区| 有坂深雪在线一区| 亚洲一区二区三区激情| 一个色综合av| 欧美 日韩 国产在线 | 亚洲欧洲综合| 午夜精品久久久99热福利| 日韩一级精品视频在线观看| 欧美在线高清| 欧美一区二区三区免费观看| 欧美日韩国产片| 欧美激情综合色| 在线观看视频亚洲| 久久九九久久九九| 欧美在线看片a免费观看| 欧美日韩国产另类不卡| 亚洲国产欧美不卡在线观看| 在线免费不卡视频| 久久精品国产69国产精品亚洲| 亚洲欧美日韩中文在线制服| 欧美乱大交xxxxx| 欧美激情精品久久久六区热门 | 国产美女一区二区| 日韩视频免费看| 夜夜爽www精品| 欧美日韩另类视频| 亚洲美女黄网| 亚洲一区二区网站| 亚洲精品日本| 亚洲美女视频| 欧美日韩国产成人| 99亚洲一区二区| 亚洲欧美日韩中文视频| 国产精品久久一区二区三区| 亚洲视频国产视频| 欧美一级网站| 国产一区二区在线观看免费播放| 午夜精品久久久久久久99热浪潮 | 欧美成人免费小视频| 亚洲电影观看| 亚洲午夜高清视频| 国产精品久久久久久久午夜片| 中文久久精品| 久久精品中文字幕一区| 有码中文亚洲精品| 欧美区一区二区三区| 亚洲视频一区二区在线观看 | 亚洲精品久久久久中文字幕欢迎你| 快射av在线播放一区| 亚洲日本欧美天堂| 亚洲一区二区三区精品在线| 国产精品美女久久久久久免费| 午夜精品久久久久久久久久久久| 久久亚洲精品一区| 亚洲免费不卡| 国产伦精品一区二区三区高清版| 久久国产精品久久精品国产| 欧美国产日本高清在线| 亚洲一区三区视频在线观看| 国产自产在线视频一区| 欧美国产专区| 欧美一区二区精品在线| 亚洲国产精品嫩草影院| 欧美一区国产在线| 亚洲青涩在线| 国产日韩欧美综合| 欧美大片在线观看| 欧美一区二区精品在线| 亚洲精品一区久久久久久| 久久久999成人| 亚洲一区影音先锋| 亚洲精品欧美激情| 国模套图日韩精品一区二区| 欧美日韩午夜剧场| 裸体一区二区| 午夜亚洲福利在线老司机| 亚洲日本中文字幕| 蜜臀久久久99精品久久久久久| 亚洲视频免费| 91久久精品国产91性色| 国产伊人精品| 国产精品看片你懂得| 欧美国产日韩亚洲一区| 久久se精品一区二区| 在线视频欧美日韩| 亚洲国产精品视频一区| 久久免费午夜影院| 久久精品成人| 欧美亚洲免费电影| 亚洲免费一级电影|