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

UNICODE與ANSI的區別 (轉)

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


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

Unicode字符串的每個字符都是16位的。

Win9x只支持ANSI;Win2000/XP/2003支持ANSI/Unicode;WinCE只支持Unicode
       附:有部分Unicode函數也可以在Win9X中使用,但可能會出現意想不到錯誤。

wchar_t是Unicode字符的數據類型。

所有的Unicode函數均以wcs開頭,ANSI函數均以str開頭;ANSI C規定C運行期庫支持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字符串轉換為Unicode字符串;
        _TEXT(" wash ")根據是否定義Unicode或_Unicode進行轉換。
       附:_Unicode用于C運行庫;Unicode用于Windows頭文件。

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

在設計dll時最好提供ANSI和Unicode函數,ANSI函數只用于分配內存,將字符轉換為Unicode字符,然后調用Unicode函數。

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

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

對Unicode字符操作的函數還有:(也有ANSI和Unicode版本)
       lstrcat() , lstrcmp() / lstrcmpi()[ 它們在內部調用CompareString() ], lstrcpy(), lstrlen()
       這些是作為宏實現的。

          C運行期函數                                       windows函數
                  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()
       轉換Buffer:DWORD   CharLowerBuffer(PTSTR   pszString , DWORD cchString)
                              DWORD CharUpperBuffer(PTSTR   pszString , DWORD   cchString)
       也可轉換單個字符,如: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
        )
       附:此函數在Win9x系統中,沒有實現代碼,始終返回FALSE

Unicode與ANSI之間的轉換
        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參數用于標識一個與多字節字符串相關的代碼頁號。d w F l a g s參數用于設定另一個控件,它可以用重音符號之類的區分標記來影響字符。這些標志通常并不使用,在d w F l a g s參數中傳遞0。p M u l t i B y t e S t r參數用于設定要轉換的字符串, c c h M u l t i B y t e參數用于指明該字符串的長度(按字節計算)。如果為c c h M u l t i B y t e參數傳遞- 1,那么該函數用于確定源字符串的長度。轉換后產生的U n i c o d e版本字符串將被寫入內存中的緩存,其地址由p Wi d e C h a r S t r參數指定。必須在c c h Wi d e C h a r參數中設定該緩存的最大值(以字符為計量單位)。如果調用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參數傳遞0,那么該參數將不執行字符串的轉換,而是返回為使轉換取得成功所需要的緩存的值。

     可以通過下列步驟將多字節字符串轉換成U n i c o d e等價字符串:
     1) 調用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參數傳遞N U L L,為c c h Wi d e C h a r參數傳遞0。
     2) 分配足夠的內存塊,用于存放轉換后的U n i c o d e字符串。該內存塊的大小由前面對M u l t B y t e To Wi d e C h a r的調用返回。
     3) 再次調用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參數來傳遞,并傳遞第一次調用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參數。
     4) 使用轉換后的字符串。
     5) 釋放U n i c o d e字符串占用的內存塊。

    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
     )

 

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

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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2013年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿

隨筆分類

隨筆檔案

文章檔案

牛人博客

搜索

積分與排名

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区高清| 亚洲欧美中文字幕| 亚洲国产成人精品久久久国产成人一区 | 亚洲一区精品电影| 性欧美在线看片a免费观看| 欧美一区91| 欧美国产视频在线| 日韩视频中文字幕| 欧美一区二区三区免费看| 麻豆精品视频在线| 国产精品免费在线| 亚洲黄色一区二区三区| 午夜免费日韩视频| 欧美一区亚洲二区| 国产精品高潮呻吟久久| 亚洲黄色大片| 一本大道久久精品懂色aⅴ| 久久精品午夜| 国产精品久久久久一区| 久久精品国产99| 夜夜嗨av一区二区三区四季av | 欧美sm重口味系列视频在线观看| 欧美日韩激情小视频| 国产亚洲欧美另类一区二区三区| 亚洲精品偷拍| 欧美jizzhd精品欧美喷水| 亚洲无限av看| 国产精品高潮呻吟久久av黑人| 久久国产日韩欧美| 欧美国产日韩亚洲一区| 伊大人香蕉综合8在线视| 亚洲日本欧美在线| 亚洲欧美日韩区| 国产精品成人av性教育| 亚洲欧洲日本在线| 欧美成人一区在线| 久久久999| 亚洲一区二区三区精品视频| 亚洲激情av在线| 亚洲欧美资源在线| 久久婷婷一区| 国产伊人精品| 久久久久久久久久久一区| 亚洲欧美日韩成人| 99精品视频免费| 99riav久久精品riav| 激情懂色av一区av二区av| 另类天堂av| 久久亚洲图片| 久久国产精品一区二区| 欧美日韩一区二区国产| 亚洲自拍偷拍色片视频| 鲁鲁狠狠狠7777一区二区| 欧美伊人久久久久久久久影院| 欧美精品一区二区高清在线观看| 99re6这里只有精品视频在线观看| 欧美一区成人| 性做久久久久久免费观看欧美 | 久久九九国产精品怡红院| 午夜欧美大片免费观看| 欧美少妇一区二区| 欧美一区二区视频在线观看2020| 欧美精品在线观看91| 亚洲综合成人婷婷小说| 欧美理论电影在线观看| 亚洲激情影院| 亚洲久色影视| 欧美一级午夜免费电影| 欧美自拍偷拍| 欧美精品日本| 亚洲欧洲一区二区三区在线观看| 亚洲经典在线| 欧美高清视频一二三区| 亚洲激情电影中文字幕| 日韩午夜av在线| 欧美日韩国产欧| 一区二区三区久久精品| 国产日韩一区二区三区在线| 亚洲电影av在线| 国产精品久久久久一区二区| 99国产欧美久久久精品| 午夜视频久久久| 国产精品亚洲综合一区在线观看| 农村妇女精品| 亚洲精品在线二区| 欧美日韩国产综合视频在线观看中文| 亚洲欧洲在线一区| 亚洲一区在线视频| 国产伦精品一区二区| 亚洲国产综合视频在线观看| 国产精品乱人伦一区二区| 亚洲无人区一区| 久久久久成人精品免费播放动漫| 一区二区在线不卡| 欧美大片免费| 乱码第一页成人| 亚洲精品乱码| 国产精品永久免费观看| 久久久av毛片精品| 亚洲人午夜精品免费| 狠狠色丁香婷婷综合影院| 一区二区三区日韩精品| 久久高清福利视频| 日韩视频永久免费| 国产欧美精品一区aⅴ影院| avtt综合网| 久久天天狠狠| 国产一区二区三区四区老人| 老司机成人网| 午夜视频久久久| 欧美在线91| 午夜精品国产| 亚洲国内在线| 国产视频精品xxxx| 欧美日韩精品欧美日韩精品| 久久精品国产清高在天天线| 亚洲一区免费网站| 精久久久久久| 国产精品三级久久久久久电影| 久久久人成影片一区二区三区观看 | 国产欧美一二三区| 欧美成人第一页| 久久精品国产亚洲aⅴ| 一区二区欧美视频| 亚洲第一精品夜夜躁人人爽 | 亚洲网址在线| 亚洲国产精品一区二区www在线| 国产精品久久久久久久久动漫| 老司机免费视频一区二区三区 | 亚洲欧洲日产国码二区| 久久综合伊人77777尤物| 亚洲欧美一区二区原创| 亚洲视频axxx| 国产精品免费看片| 欧美日韩久久精品| 你懂的一区二区| 麻豆久久精品| 久久婷婷国产综合精品青草| 久久国产加勒比精品无码| 亚洲一区二区三区四区五区黄| 日韩一区二区精品视频| 亚洲精品久久久久中文字幕欢迎你| 欧美波霸影院| 欧美激情在线| 亚洲国产成人91精品| 亚洲成人自拍视频| 亚洲精品一二三区| 91久久久久| 一区二区三区.www| 国产视频自拍一区| 国产日韩av在线播放| 国产日产亚洲精品| 国内外成人在线视频| 黑人操亚洲美女惩罚| 尤物yw午夜国产精品视频| 亚洲高清成人| 日韩视频免费观看| 亚洲永久字幕| 欧美在线观看一二区| 久久久成人精品| 女同一区二区| 亚洲区一区二区三区| 99综合视频| 欧美一区二区免费| 久久婷婷色综合| 欧美日韩国产成人在线| 国产精品国产福利国产秒拍| 国产精品自拍一区| 尤妮丝一区二区裸体视频| 亚洲精品一区在线观看| 亚洲一区二区三区激情| 久久精品99国产精品| 欧美成人四级电影| 99伊人成综合| 久久国产精品久久精品国产| 欧美1区2区3区| 国产精品美女xx| 在线日韩av| 在线观看日韩精品| 中国女人久久久| 老司机一区二区三区| 日韩午夜激情电影| 久久不射中文字幕| 欧美日韩999| 樱桃视频在线观看一区| 中文av字幕一区| 噜噜噜91成人网| 一区二区福利| 免费人成精品欧美精品| 国产精品久久久久9999吃药| 在线视频成人| 欧美一级成年大片在线观看| 亚洲第一精品夜夜躁人人躁| 亚洲欧美激情精品一区二区| 亚洲一区二区精品视频| 麻豆精品精华液| 国产亚洲午夜| 亚洲欧美日韩国产成人精品影院| 亚洲自拍16p| 亚洲国产91精品在线观看|