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

            文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
            數據加載中……

            GBK, UCS和UTF8相互轉換

            最近學習了下編碼

            以下地址可以很好的學習到相關的知識

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

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

            其中講了UTF8的編碼

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

            我自己寫了轉換的代碼如下

            UCSUTF8相互轉換

            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轉換

            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久久久久| 人妻少妇久久中文字幕一区二区| 久久亚洲精品国产精品| 色欲综合久久躁天天躁蜜桃| 精品人妻久久久久久888| 久久91精品综合国产首页| 国色天香久久久久久久小说| 久久精品视频网| 久久精品人妻中文系列| 亚洲国产精品久久久久婷婷老年| 欧美成a人片免费看久久| 青草国产精品久久久久久| 亚洲色欲久久久久综合网 | 人妻精品久久久久中文字幕69| 国产精品久久久久久福利69堂| 久久亚洲欧洲国产综合| 久久国产亚洲精品麻豆| 久久精品国产亚洲AV久| 久久久久无码国产精品不卡| 久久久久久狠狠丁香| 久久久av波多野一区二区| 色播久久人人爽人人爽人人片AV| 91久久精品电影| 久久国产成人精品麻豆| 麻豆AV一区二区三区久久| 久久久久久精品久久久久| 久久久久久久综合综合狠狠| 国产精品无码久久久久| 久久精品国产亚洲沈樵| 久久综合综合久久狠狠狠97色88| 国产精品一久久香蕉国产线看观看 | 亚洲精品无码久久久久去q| 伊人久久一区二区三区无码| 久久久久国色AV免费观看| 国内精品久久久久久久coent| 色综合久久久久| 国产成人精品久久亚洲高清不卡| 97精品伊人久久久大香线蕉| 93精91精品国产综合久久香蕉 | 久久久久这里只有精品| 久久性精品|