• <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>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            GBK, UCS和UTF8相互轉(zhuǎn)換

            最近學(xué)習(xí)了下編碼

            以下地址可以很好的學(xué)習(xí)到相關(guān)的知識(shí)

            http://dev.csdn.net/develop/article/69/69883.shtm

            http://dev.csdn.net/develop/article/72/72888.shtm

            其中講了UTF8的編碼

            當(dāng)要表示的內(nèi)容是 7位 的時(shí)候就用一個(gè)字節(jié):0*******  第一個(gè)0為標(biāo)志位,剩下的空間正好可以表示ASCII 0127 的內(nèi)容。
              當(dāng)要表示的內(nèi)容在 8 到 11 位的時(shí)候就用兩個(gè)字節(jié):110***** 10******  第一個(gè)字節(jié)的110和第二個(gè)字節(jié)的10為標(biāo)志位。
              當(dāng)要表示的內(nèi)容在 12 到 16 位的時(shí)候就用三個(gè)字節(jié):1110***** 10****** 10******    和上面一樣,第一個(gè)字節(jié)的1110和第二、三個(gè)字節(jié)的10都是標(biāo)志位,剩下的空間正好可以表示漢字。
              以此類推:
            四個(gè)字節(jié):11110**** 10****** 10****** 10******
              五個(gè)字節(jié):111110*** 10****** 10****** 10****** 10******
              六個(gè)字節(jié):1111110** 10****** 10****** 10****** 10****** 10******
              .............................................

            我自己寫了轉(zhuǎn)換的代碼如下

            UCSUTF8相互轉(zhuǎn)換

            int UCS2UTF8(wchar_t* pUCS,unsigned char* pUTF8)
            {
            int UCSlen = 0, UTF8len = 0, i;
            unsigned char* pTempUTF8 = NULL;
            UCSlen = wcslen(pUCS);

            if(pUCS == NULL || pUTF8 == NULL)
              return -1;
             
            pTempUTF8 = pUTF8;
            for(i = 0; i < UCSlen; i++)
            {
              if(pUCS[i] <= 0x007F)//1 byte 0xxxxxxx
              {
               *(pTempUTF8++) = LOBYTE(pUCS[i]);
               UTF8len++;
              }
              else if(pUCS[i] <=0x07FF)//2 bytes 110xxxxx 10xxxxxx
              {
               *(pTempUTF8++) = HIBYTE(pUCS[i] << 2) & 0x3F | 0xC0;
               *(pTempUTF8++) = LOBYTE(pUCS[i] & 0x3f) | 0x80;
               UTF8len += 2;
              }
              else//3 bytes 1110xxxx 10xxxxxx 10xxxxxx
              {
               *(pTempUTF8++) = HIBYTE(pUCS[i] >> 4) | 0xe0;
               *(pTempUTF8++) = HIBYTE(pUCS[i] << 2) & 0x3F | 0x80;
               *(pTempUTF8++) = LOBYTE(pUCS[i]) & 0x3F | 0x80;
               UTF8len += 3;
              }
            }
             
            return UTF8len;
            }
            int UTF82UCS(unsigned char *pUTF8, wchar_t *pUCS)
            {
            int UCSlen = 0, i;
            unsigned char *pTempUCS = NULL;
            unsigned char *pTempUTF8 = NULL;

            if(pUCS == NULL || pUTF8 == NULL)
              return -1;
            UCSlen = MultiByteToWideChar(CP_UTF8,0,pUTF8,-1,NULL,0);
            UCSlen--;
            pTempUCS = (char*)pUCS;
            pTempUTF8 = pUTF8;
            for(i = 0; i < UCSlen; i++)
            {
              if((*pTempUTF8) <= 0x7F)  //1 byte
              {
               *(pTempUCS + 1) = 0x00;
               *pTempUCS = *(pTempUTF8++);
               pTempUCS += 2;
              }
              else if((*pTempUTF8) >= 0xC0 && (*pTempUTF8) <= 0xDF)//2 bytes
              {
               *(pTempUCS + 1) = ((*pTempUTF8) >> 2) & 0x07;
               *pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8 + 1) & 0x3F);
               pTempUTF8 += 2;
               pTempUCS += 2;
              }
              else//3 bytes
              {
               *(pTempUCS + 1) = ((*pTempUTF8) << 4) | ((*(pTempUTF8 + 1) >> 2) & 0x0F);
               pTempUTF8++;
               *pTempUCS = ((*pTempUTF8) << 6) | (*(pTempUTF8+1) & 0x3F);
               pTempUTF8 += 2;
               pTempUCS += 2;
              }
            }
            return UCSlen;
            }

            其他編碼和UCS轉(zhuǎn)換

            int ToUCS(unsigned char *p,wchar_t* pUCS,int codepage)
            {
            int len = 0;

            if(pUCS == NULL || p == NULL)
              return -1;
            len = MultiByteToWideChar(codepage,0,p,-1,NULL,0);
            MultiByteToWideChar(codepage,0,p,-1,pUCS,len);
            return len;
            }

            int UCSTo(wchar_t* pUCS,char *p,int codepage)
            {
            int len = 0;
             
            if(pUCS == NULL || pBIG5 == NULL)
              return -1;

            len = WideCharToMultiByte(codepage,0,pUCS,-1,NULL,0,NULL,NULL);
            WideCharToMultiByte(codepage,0,pUCS,-1,p,len,NULL,NULL);
            len--;
            return len;
            }

            這里的codepageMSDN定義如下

            Bit

            Code page

            Description

            ANSI

             

             

            0

            1252

            Latin 1

            1

            1250

            Latin 2: Eastern Europe

            2

            1251

            Cyrillic

            3

            1253

            Greek

            4

            1254

            Turkish

            5

            1255

            Hebrew

            6

            1256

            Arabic

            7

            1257

            Baltic

            8

            1258

            VietNam

            9 - 15

             

            Reserved for ANSI

            ANSI and
            OEM

             

             

            16

            874

            Thai

            17

            932

            Japanese, Shift-JIS

            18

            936

            Chinese: Simplified chars—PRC and Singapore

            19

            949

            Korean Unified Hangeul Code (Hangeul TongHabHyung Code)

            20

            950

            Chinese: Traditional chars—Hong Kong SAR, PRC and Taiwan

            21

            1361

            Korean (Johab)

            22 - 29

             

            Reserved for alternate ANSI and OEM

            30 - 31

             

            Reserved by system.

            OEM

             

             

            32 - 46

             

            Reserved for OEM

            47

            1258

            VietNam

            48

            869

            IBM Greek

            49

            866

            MS-DOS Russian

            50

            865

            MS-DOS Nordic

            51

            864

            Arabic

            52

            863

            MS-DOS Canadian French

            53

            862

            Hebrew

            54

            861

            MS-DOS Icelandic

            55

            860

            MS-DOS Portuguese

            56

            857

            IBM Turkish

            57

            855

            IBM Cyrillic; primarily Russian

            58

            852

            Latin 2

            59

            775

            Baltic

            60

            737

            Greek; former 437 G

            61

            708

            Arabic; ASMO 708

            62

            850

            Western European/Latin 1

            63

            437

            US

             

            posted on 2009-09-10 23:13 肥仔 閱讀(2050) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 字符編碼

            久久综合伊人77777麻豆| 亚洲国产精品18久久久久久| 久久久精品一区二区三区| 久久九九亚洲精品| 午夜精品久久久久9999高清| 久久永久免费人妻精品下载| 久久久久久噜噜精品免费直播| 久久国产精品无| 99久久精品费精品国产一区二区| 久久精品中文字幕第23页| 婷婷五月深深久久精品| 久久久久久亚洲精品不卡| 国产精品美女久久久m| 久久亚洲国产精品123区| 欧美一区二区三区久久综合 | 久久91精品国产91| 久久国产高潮流白浆免费观看| 久久久久综合中文字幕| 午夜不卡888久久| 国内精品久久久人妻中文字幕| 亚洲国产成人久久综合野外| 国产三级观看久久| 久久国产乱子伦精品免费强| 亚洲精品国产美女久久久| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 热久久这里只有精品| 亚洲va中文字幕无码久久不卡| 久久精品免费大片国产大片| 国产精品久久久久aaaa| 日本欧美久久久久免费播放网| 人人妻久久人人澡人人爽人人精品| 精品综合久久久久久88小说| 国产亚洲美女精品久久久久狼| 久久人妻少妇嫩草AV无码专区| 午夜精品久久久久久久久| 亚洲熟妇无码另类久久久 | 中文字幕久久欲求不满| 国产精品久久久久天天影视| WWW婷婷AV久久久影片| 久久精品国产精品青草| 91久久九九无码成人网站|