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

UNICODE與ANSI的區(qū)別 (轉(zhuǎn))

        什么是ANSI,什么又是UNICODE呢?其實(shí)這是兩種不同的編碼方式標(biāo)準(zhǔn),ANSI中的字符采用8bit,而UNICODE中的字符采用16bit。(對(duì)于字符來說ANSI以單字節(jié)存放英文字符,以雙字節(jié)存放中文等字符,而Unicode下,英文和中文的字符都以雙字節(jié)存放)Unicode碼也是一種國(guó)際標(biāo)準(zhǔn)編碼,采用二個(gè)字節(jié)編碼,與ANSI碼不兼容。目前,在網(wǎng)絡(luò)、Windows系統(tǒng)和很多大型軟件中得到應(yīng)用。8bit的ANSI編碼只能表示256種字符,表示26個(gè)英文字母是綽綽有余的,但是表示漢字,韓國(guó)語等有著成千上萬個(gè)字符的非西方字符肯定就不夠了,正是如此才引入了UNICODE標(biāo)準(zhǔn)。   
     在軟件開發(fā)中,特別是使用C語言的一些有關(guān)字符串處理的函數(shù),ANSI和UNICODE是區(qū)分是用的,那么ANSI類型的字符和UNICODE類型的字符如何定義,如何使用呢?ANSI和UNICODE又如何轉(zhuǎn)換呢?   
   一.定義部分:  
   ANSI:char    str[1024]; 可用字符串處理函數(shù):strcpy( ),    strcat( ),   strlen( )等等。
UNICODE:wchar_t    str[1024];可用字符串處理函數(shù)   
二.可用函數(shù): 
   ANSI:即char,可用字符串處理函數(shù):strcat(    ),strcpy(    ),    strlen(    )等以str打頭的函數(shù)。   
   UNICODE:即wchar_t 可用字符串處理函數(shù):wcscat(),wcscpy(),wcslen()等以wcs打頭的函數(shù)。   
   三.系統(tǒng)支持  
      Windows    98    :只支持ANSI。   
      Windows    2k    :既支持ANSI又支持UNICODE。   
      Windows    CE    :只支持UNICODE。   
      說明   
      1 在COM里面只支持UNICODE。   
      2.Windows   2000整個(gè)OS系統(tǒng)都是基于UNICODE的,為此在windows 2000 下使用ANSI是需要付出代價(jià)的,雖然在編碼上不用任何的轉(zhuǎn)換,但是這種轉(zhuǎn)化是隱藏的,是占用系統(tǒng)資源的(CPU,內(nèi)存)。   
      3 在Windows 98下必須使用UNICODE,則需要自己手動(dòng)的編碼切換。   
    四.如何區(qū)分:   
    在我們軟件開發(fā)中往往需要即支持ANSI又支持UNICODE,不可能在要求類型轉(zhuǎn)換的時(shí)候,重新改變字符串的類型,和使用于字符串上的操作函數(shù)。為此, 標(biāo)準(zhǔn)C運(yùn)行期庫(kù)和Windows 提供了宏定義的方式。   
    在C語言里面提供了 _UNICODE宏(有下劃線),在Windows里面提供了UNICODE宏(無下劃線),只要定了_UNICODE宏和UNICODE宏,系統(tǒng)就會(huì)自動(dòng)切換到UNICODE版本,否則,系統(tǒng)按照ANSI的方式進(jìn)行編譯和運(yùn)行。   
    只定義了宏并不能實(shí)現(xiàn)自動(dòng)的轉(zhuǎn)換,他還需要一系列的字符定義支持。   
   1. TCHAR   
   如果定義了UNICODE宏則TCHAR被定義為wchar_t。   
    typedef    wchar_t    TCHAR;   
    否則TCHAR被定義為char   
    typedef    char   TCHAR;   
   2.LPTSTR   
如果定義了UNICODE宏則LPTSTR被定義為L(zhǎng)PWSTR。(以前一直不知道LPWSTR是什么東東,終于明白了)   
   typedef    LPTSTR   LPWSTR;   
   否則TCHAR被定義為char   
   typedef    LPTSTR   LPSTR;  
補(bǔ)充一下:
UTF-8是可以用于真正的流式傳輸?shù)模琔nicode是一種編碼方案   
    我的理解是UTF-8是Unicode的一種具體實(shí)現(xiàn)。類似的實(shí)現(xiàn)還有UTF-16等等。


ANSI/Unicode字符和字符串 
TChar.h是String.h的修改,用于創(chuàng)建ANSI/Unicode通用字符串。

Unicode字符串的每個(gè)字符都是16位的。

Win9x只支持ANSI;Win2000/XP/2003支持ANSI/Unicode;WinCE只支持Unicode
       附:有部分Unicode函數(shù)也可以在Win9X中使用,但可能會(huì)出現(xiàn)意想不到錯(cuò)誤。

wchar_t是Unicode字符的數(shù)據(jù)類型。

所有的Unicode函數(shù)均以wcs開頭,ANSI函數(shù)均以str開頭;ANSI C規(guī)定C運(yùn)行期庫(kù)支持ANSI和Unicode
                                 ANSI                                                                              Unicode
       char   *strcat(char   *,   const   char   *)                           wchar_t   *wcscat(wchar_t   *,   const   wchar_t   *) 
       char   *strchr(const   char * , int)                                   wchar_t    *wcschr(const   wchar_t   * , int) 
       int   strcmp(const   char   *,    const   char   *)                int    wcscmp(const   wchar_t   *, const   wchar_t *)
       char *strcpy(char   *,   const   char   *)                           wchar_t   *wcscpy(wchar_t    *,   const   wchar_t    *)
       size_t   strlen(const   char   *)                                        wchar_t    wcslen(const   wchar_t   *)

L" wash " : 用于將ANSI字符串轉(zhuǎn)換為Unicode字符串;
        _TEXT(" wash ")根據(jù)是否定義Unicode或_Unicode進(jìn)行轉(zhuǎn)換。
       附:_Unicode用于C運(yùn)行庫(kù);Unicode用于Windows頭文件。

ANSI/Unicode通用數(shù)據(jù)類型
                        Both(ANSI/Unicode)                    ANSI                       Unicode
                               LPCTSTR                                 LPCSTR                   LPCWSTR
                               LPTSTR                                    LPSTR                      LPWSTR
                               PCTSTR                                   PCSTR                      PCWSTR
                               PTSTR                                      PSTR                         PWSTR
                               TBYTE(TCHAR)                      CHAR                         WCHAR

在設(shè)計(jì)dll時(shí)最好提供ANSI和Unicode函數(shù),ANSI函數(shù)只用于分配內(nèi)存,將字符轉(zhuǎn)換為Unicode字符,然后調(diào)用Unicode函數(shù)。

最好使用操作系統(tǒng)函數(shù),少使用或不實(shí)用C運(yùn)行期函數(shù)
        eg:操作系統(tǒng)字符串函數(shù)(shlWApi.h)
                StrCat(), StrChr(), StrCmp(), StrCpy()等
                注意它們區(qū)分大小寫,也區(qū)分ANSI和Unicode版本
        附:ANSI版函數(shù)在原函數(shù)后加大寫字母A
                Unicode函數(shù)在原函數(shù)后加大寫字母W

成為符合ANSI和Unicode的函數(shù)
        ? 將文本串視為字符數(shù)組,而不是c h a r s數(shù)組或字節(jié)數(shù)組。
        ? 將通用數(shù)據(jù)類型(如T C H A R和P T S T R)用于文本字符和字符串。
        ? 將顯式數(shù)據(jù)類型(如B Y T E和P B Y T E)用于字節(jié)、字節(jié)指針和數(shù)據(jù)緩存。
        ? 將T E X T宏用于原義字符和字符串。
        ? 修改字符串運(yùn)算問題 。
          如:sizeof(szBuffer) -> sizeof(szBuffer) / sizeof(TCHAR)
                  malloc(charNum) -> malloc(charNum * sizeof(TCHAR))   

對(duì)Unicode字符操作的函數(shù)還有:(也有ANSI和Unicode版本)
       lstrcat() , lstrcmp() / lstrcmpi()[ 它們?cè)趦?nèi)部調(diào)用CompareString() ], lstrcpy(), lstrlen()
       這些是作為宏實(shí)現(xiàn)的。

          C運(yùn)行期函數(shù)                                       windows函數(shù)
                  tolower()                                  PTSTR   CharLower(PTSTR   pszString)
                  toupper()                                 PTSTR   CharUpper(PTSTR   pszString)
                  isalpha()                                  BOOL   IsCharAlpha(TCHAR   ch)
                                                                   BOOL   ISCharAlphaNumeric(TCHAR   ch)
                  islower()                                  BOOL   IsCharLower(TCHAR   ch)
                  isupper()                                 BOOL   IsCharUpper(TCHAR   ch)
                  print()                                       wsprintf()
       轉(zhuǎn)換Buffer:DWORD   CharLowerBuffer(PTSTR   pszString , DWORD cchString)
                              DWORD CharUpperBuffer(PTSTR   pszString , DWORD   cchString)
       也可轉(zhuǎn)換單個(gè)字符,如:TCHAR   cLowerCaseChar = CharLower((PTSTR)szString[0])

確定字符是ANSI或Unicode
        BOOL   IsTextUnicode(
                     const   VOID   * pBuffer,   //input   buffer   to be   examined
                     int   cb,                               //size of input   buffer
                     LPINT   lpi                         //options
        )
       附:此函數(shù)在Win9x系統(tǒng)中,沒有實(shí)現(xiàn)代碼,始終返回FALSE

Unicode與ANSI之間的轉(zhuǎn)換
        char   szA[40];
        wchar   szW[40];
        // Normal   sprintf : all   string   are   ANSI
        sprintf( szA , " %s " , " ANSI   str ");
        // Convert   Unicode   string   to ANSI
        sprintf(   szA,   " %S " ,   L" Unicode   str ");
        // Normal   swprintf : all string are unicode
        swprinf( szW , "%s" , L" Unicode   str ");
        // Convert   ANSI   String to Unicode
        swprinf( szW, L"%S" , "ANSI str");

        int   MultiByteToWideChar(
              UINT   uCodePage,                   //code page,   0
              DWORD   dwFlags,                   //character-type   options,   0
              PCSTR   pMultiByte,                  //source   string   Addr
              int   cchMultiByte,                       //source   string   byte length
              PWSTR   pWideCharStr,          //Dest string   Addr
              int   cchWideChar                      //Dest   string char   Nums
         )
        u C o d e P a g e參數(shù)用于標(biāo)識(shí)一個(gè)與多字節(jié)字符串相關(guān)的代碼頁號(hào)。d w F l a g s參數(shù)用于設(shè)定另一個(gè)控件,它可以用重音符號(hào)之類的區(qū)分標(biāo)記來影響字符。這些標(biāo)志通常并不使用,在d w F l a g s參數(shù)中傳遞0。p M u l t i B y t e S t r參數(shù)用于設(shè)定要轉(zhuǎn)換的字符串, c c h M u l t i B y t e參數(shù)用于指明該字符串的長(zhǎng)度(按字節(jié)計(jì)算)。如果為c c h M u l t i B y t e參數(shù)傳遞- 1,那么該函數(shù)用于確定源字符串的長(zhǎng)度。轉(zhuǎn)換后產(chǎn)生的U n i c o d e版本字符串將被寫入內(nèi)存中的緩存,其地址由p Wi d e C h a r S t r參數(shù)指定。必須在c c h Wi d e C h a r參數(shù)中設(shè)定該緩存的最大值(以字符為計(jì)量單位)。如果調(diào)用M u l t i B y t e To Wi d e C h a r,給c c h Wi d e C h a r參數(shù)傳遞0,那么該參數(shù)將不執(zhí)行字符串的轉(zhuǎn)換,而是返回為使轉(zhuǎn)換取得成功所需要的緩存的值。

     可以通過下列步驟將多字節(jié)字符串轉(zhuǎn)換成U n i c o d e等價(jià)字符串:
     1) 調(diào)用M u l t i B y t e To Wi d e C h a r函數(shù),為p Wi d e C h a r S t r參數(shù)傳遞N U L L,為c c h Wi d e C h a r參數(shù)傳遞0。
     2) 分配足夠的內(nèi)存塊,用于存放轉(zhuǎn)換后的U n i c o d e字符串。該內(nèi)存塊的大小由前面對(duì)M u l t B y t e To Wi d e C h a r的調(diào)用返回。
     3) 再次調(diào)用M u l t i B y t e To Wi d e C h a r,這次將緩存的地址作為p Wi d e C h a r S t r參數(shù)來傳遞,并傳遞第一次調(diào)用M u l t i B y t e To Wi d e C h a r時(shí)返回的緩存大小,作為c c h Wi d e c h a r參數(shù)。
     4) 使用轉(zhuǎn)換后的字符串。
     5) 釋放U n i c o d e字符串占用的內(nèi)存塊。

    int WideCharToMultiByte(
          UINT CodePage,                        // code page
          DWORD dwFlags,                      // performance and mapping flags
          LPCWSTR lpWideCharStr,      // wide-character string
          int cchWideChar,                       // number of chars in string
          LPSTR lpMultiByteStr,               // buffer for new string
          int cbMultiByte,                           // size of buffer
          LPCSTR lpDefaultChar,            // default for unmappable chars
          LPBOOL lpUsedDefaultChar   // set when default char used
     )

 

本文轉(zhuǎn)自:http://hi.baidu.com/%C6%DF%D4%C2%BA%A3%C0%B6/blog/item/65639b25cc31f16234a80fc4.html

posted on 2011-09-07 16:21 Daywei 閱讀(851) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 基礎(chǔ)底層知識(shí)


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            午夜精品一区二区三区在线视| 亚洲制服av| 欧美日韩美女| 欧美成人精品影院| 亚洲视频一区二区| 一区二区三区精品| 一本不卡影院| 亚洲一区二区网站| 亚洲欧美视频在线观看| 亚洲一区激情| 欧美一区二区啪啪| 久久亚洲影音av资源网| 你懂的国产精品| 亚洲福利视频在线| 亚洲第一天堂av| 99精品国产在热久久下载| 亚洲视频在线观看| 欧美一级成年大片在线观看| 久久精品一区二区国产| 欧美福利网址| 国产精品视频你懂的| 一区在线免费| 一区二区国产日产| 久久精品视频99| 亚洲激情视频在线| 亚洲一区三区视频在线观看 | 国产精品区二区三区日本| 国产精品天天看| 亚洲国产成人av好男人在线观看| 亚洲乱码国产乱码精品精可以看| 午夜视频在线观看一区| 另类成人小视频在线| 日韩一区二区精品葵司在线| 久久精品国产清自在天天线 | 日韩视频中文| 欧美一区二区视频免费观看| 欧美激情亚洲激情| 国产亚洲精品自拍| 一区二区日韩免费看| 噜噜噜噜噜久久久久久91 | 久久精品一二三| 国产精品www色诱视频| 亚洲国产一区二区三区在线播| 性做久久久久久久免费看| 亚洲国产日韩欧美综合久久 | 亚洲综合国产精品| 日韩亚洲在线观看| 亚洲天堂久久| 久久综合久久综合久久综合| 日韩视频不卡中文| 久久婷婷一区| 亚洲日本视频| 久久久久久久久久久久久久一区| 国产精品v亚洲精品v日韩精品| 亚洲国产日韩美| 老司机67194精品线观看| 午夜影视日本亚洲欧洲精品| 欧美午夜无遮挡| 中文在线资源观看视频网站免费不卡| 免费成人在线观看视频| 午夜亚洲性色福利视频| 国产精品裸体一区二区三区| 中文有码久久| 亚洲精品美女在线观看| 欧美激情第3页| 91久久夜色精品国产网站| 欧美www视频| 开元免费观看欧美电视剧网站| 国产一区高清视频| 久久三级视频| 久久免费视频网| 亚洲东热激情| 亚洲高清色综合| 欧美韩国一区| 亚洲另类春色国产| 日韩视频永久免费观看| 亚洲影院污污.| 国产精品免费在线| 欧美高清在线一区| 亚洲国产一区二区视频| 欧美成人69av| 免费久久精品视频| 在线日韩视频| 久久亚洲电影| 欧美不卡视频| 一本色道久久88综合亚洲精品ⅰ| 久久亚洲一区| 欧美黑人一区二区三区| 亚洲人线精品午夜| 欧美日韩喷水| 久久国产精品久久久久久久久久 | 亚洲精品婷婷| 免费在线国产精品| 日韩亚洲精品电影| 亚洲毛片在线观看| 国产精品一区二区久久久久| 久久大综合网| 蜜桃av噜噜一区| 亚洲午夜三级在线| 欧美中在线观看| 日韩视频一区二区三区| 在线视频亚洲| 尤物99国产成人精品视频| 亚洲精品一区在线| 国内精品美女在线观看| 亚洲精品少妇网址| 国模 一区 二区 三区| 亚洲精品社区| 亚洲高清不卡一区| 亚洲欧美国产另类| 99国产精品久久| 久久久www成人免费毛片麻豆| 亚洲色图自拍| 美女性感视频久久久| 久久国产日韩欧美| 欧美日韩一区免费| 欧美激情视频在线播放| 国产一区在线观看视频| 一区二区三区欧美视频| 亚洲日本中文| 久久中文久久字幕| 久久精品人人做人人爽| 欧美亚洲不卡| 亚洲巨乳在线| 99国产精品久久久| 美女视频黄免费的久久| 久久先锋影音| 国产色视频一区| 亚洲网站在线播放| 亚洲一区黄色| 欧美性色aⅴ视频一区日韩精品| 女同一区二区| 国内精品久久久久伊人av| 欧美亚洲三区| 久久大综合网| 国精品一区二区| 久久精品亚洲| 久久躁日日躁aaaaxxxx| 国内精品久久国产| 久久国产综合精品| 久久av一区| 国产午夜精品在线观看| 欧美一级黄色网| 久久久久久久网站| 国精产品99永久一区一区| 久久成人亚洲| 久久人人九九| 亚洲第一毛片| 欧美国产精品专区| 亚洲欧洲视频| 一区二区三区日韩欧美精品| 欧美成人国产一区二区| 国内精品写真在线观看| 久久久国产一区二区| 美女在线一区二区| 亚洲精品一区在线观看| 欧美日本精品在线| 小嫩嫩精品导航| 亚洲欧美精品伊人久久| 欧美一级大片在线观看| 国产一区二区av| 久久av老司机精品网站导航| 美女图片一区二区| 日韩视频欧美视频| 国产精品v片在线观看不卡| 香蕉av777xxx色综合一区| 欧美成人一区二免费视频软件| 亚洲国产美女| 欧美亚洲成人精品| 久久成人综合视频| 亚洲国产精选| 亚欧成人在线| 亚洲丶国产丶欧美一区二区三区| 欧美成人一区二区三区| 妖精视频成人观看www| 久久精品国产91精品亚洲| 亚洲成色www8888| 国产精品av一区二区| 久久九九全国免费精品观看| 亚洲精品乱码视频| 久久久噜噜噜久久狠狠50岁| 亚洲国产精品久久人人爱蜜臀| 国产精品久久国产愉拍| 久久久在线视频| 一区二区三区四区国产| 猛干欧美女孩| 午夜在线不卡| 日韩午夜免费视频| 国产主播一区二区三区| 欧美日韩国产123区| 久久国产精品99精品国产| 日韩午夜电影av| 欧美不卡视频一区发布| 香蕉av福利精品导航| 日韩视频一区二区在线观看| 国产婷婷97碰碰久久人人蜜臀| 欧美日韩一区二区免费视频| 六月婷婷久久| 久久久久久久高潮| 午夜在线观看免费一区|