• <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)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

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

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

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

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

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

            其中講了UTF8的編碼

            當(dāng)要表示的內(nèi)容是 7位 的時候就用一個字節(jié):0*******  第一個0為標(biāo)志位,剩下的空間正好可以表示ASCII 0127 的內(nèi)容。
              當(dāng)要表示的內(nèi)容在 8 到 11 位的時候就用兩個字節(jié):110***** 10******  第一個字節(jié)的110和第二個字節(jié)的10為標(biāo)志位。
              當(dāng)要表示的內(nèi)容在 12 到 16 位的時候就用三個字節(jié):1110***** 10****** 10******    和上面一樣,第一個字節(jié)的1110和第二、三個字節(jié)的10都是標(biāo)志位,剩下的空間正好可以表示漢字。
              以此類推:
            四個字節(jié):11110**** 10****** 10****** 10******
              五個字節(jié):111110*** 10****** 10****** 10****** 10******
              六個字節(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 肥仔 閱讀(2055) 評論(0)  編輯 收藏 引用 所屬分類: 字符編碼

            久久99精品久久久久久不卡 | 97久久精品国产精品青草| 久久99精品久久久久久动态图| 99国产欧美久久久精品蜜芽| 成人国内精品久久久久影院| 久久播电影网| 久久婷婷成人综合色综合| 97久久精品人人做人人爽| 伊人久久大香线蕉av不卡| 国产91久久精品一区二区| 三级韩国一区久久二区综合| 囯产精品久久久久久久久蜜桃| 亚洲国产精品久久久久| 女人高潮久久久叫人喷水| 精品久久久久久久无码| 99久久精品免费观看国产| 理论片午午伦夜理片久久| 久久久久亚洲AV无码永不| 久久中文精品无码中文字幕| 国产成人精品综合久久久| 亚洲国产二区三区久久| 99久久精品国产一区二区| 精品久久久久久国产免费了| 久久丫精品国产亚洲av| 亚洲精品无码久久不卡| 国产精品久久久久一区二区三区| 奇米影视7777久久精品| 久久无码AV一区二区三区| 久久综合色区| 久久精品无码一区二区三区日韩| 久久精品无码专区免费青青| 日韩精品久久无码中文字幕| 亚洲午夜精品久久久久久app| 国产精品午夜久久| 色综合久久久久网| 曰曰摸天天摸人人看久久久| 久久亚洲AV成人无码国产| 亚洲级αV无码毛片久久精品 | 欧美久久亚洲精品| 亚洲人AV永久一区二区三区久久| 欧美日韩成人精品久久久免费看|