• <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 肥仔 閱讀(2041) 評論(0)  編輯 收藏 引用 所屬分類: 字符編碼

            久久久久久久人妻无码中文字幕爆 | 日韩久久无码免费毛片软件| 国内精品久久久久久久久电影网 | 欧美熟妇另类久久久久久不卡| 久久久久国产精品熟女影院| 99久久99久久精品国产| 久久久久久精品无码人妻| 欧美精品一区二区精品久久| 亚洲另类欧美综合久久图片区| 狠狠色丁香久久婷婷综合五月| 久久伊人五月天论坛| 久久精品国产亚洲av日韩| 欧美久久综合九色综合| 91精品国产综合久久久久久| 一本色道久久88综合日韩精品 | 亚洲中文字幕无码一久久区| 国产精品免费久久久久电影网| 日韩人妻无码精品久久免费一| 日韩欧美亚洲国产精品字幕久久久| 国产成人久久激情91| 久久久久久曰本AV免费免费| 久久九九久精品国产免费直播| 精品久久人妻av中文字幕| 久久99这里只有精品国产| 久久国产成人精品国产成人亚洲| 狠狠色婷婷久久一区二区三区| 一级女性全黄久久生活片免费| 精品乱码久久久久久夜夜嗨 | 久久精品桃花综合| 久久综合成人网| 欧洲国产伦久久久久久久| 亚洲国产精品久久| 国产精自产拍久久久久久蜜| 久久精品嫩草影院| 曰曰摸天天摸人人看久久久| 久久久精品免费国产四虎| 99久久99这里只有免费的精品| 久久精品欧美日韩精品| 久久国产精品一国产精品金尊| 日产精品久久久一区二区| 亚洲va中文字幕无码久久不卡|