zoukankan      html  css  js  c++  java
  • UNICODE与ANSI的区别

    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://apps.hi.baidu.com/share/detail/16868995

  • 相关阅读:
    DPDK安装方法 17.12.13
    numa.h:No such file or directory 解决方法
    17秋 软件工程 第六次作业 Beta冲刺 Scrum3
    17秋 软件工程 第六次作业 Beta冲刺 总结博客
    17秋 软件工程 第六次作业 Beta冲刺 Scrum2
    Paper Reviews and Presentations
    17秋 软件工程 第六次作业 Beta冲刺 Scrum1
    17秋 软件工程 第六次作业 Beta冲刺
    error: could not create '/System/Library/Frameworks/Python.framework/Versions/2.7/share': Operation not permitted
    17秋 软件工程 个人作业 软件产品案例分析
  • 原文地址:https://www.cnblogs.com/tianya10319/p/2019105.html
Copyright © 2011-2022 走看看