什么是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      )

UNICODE与ANSI的区别的更多相关文章

  1. AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别

    大家平时遇到乱码问题是否有自己的一套解决方案?这篇文章就是介绍一下常用的编码方式关于编码ansi.GB2312.unicode与utf-8的区别 先做一个小小的试验: 在一个文件夹里,把一个txt文本 ...

  2. Ansi,UTF8,Unicode,ASCII编码的区别

    Ansi,UTF8,Unicode,ASCII编码的区别 近日需要不同的编码,关于上述编码,一直迷迷糊糊,查了些资料,总算大致了解了, 下面全是从网上搜来的: 1.  ASCII和Ansi编码     ...

  3. unicode编码与utf-8 区别

    unicode编码与utf-8 区别 如果是为了跨平台兼容性,只需要知道,在 Windows 记事本的语境中: 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码.[1] ...

  4. 有关UNICODE、ANSI字符集和相关字符串操作

    Q UNICODE字符串如何显示 A 如果程序定义了_UNICODE宏直接用 WCHAR *str=L"unicodestring"; TextOut(0,0,str); 否则就需 ...

  5. [转]unicode,ansi,utf-8,unicode big endian的故事

    unicode,ansi,utf-8,unicode big endian的故事很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的 ...

  6. UNICODE和ANSI字符串的转换(解释了MultiByteToWideChar,WideCharToMultiByte,GetTextCharsetInfo,GetTextCharset,IsDBCSLeadByte,IsDBCSLeadByteEx,IsTextUnicode一共7个函数)

    继上集故事<多字符集(ANSI)和UNICODE及字符串处理方式准则 >,我们现在有一些特殊需求: 有时候我们的字符串是多字符型,我们却需要使用宽字符型:有的时候却恰恰相反. Window ...

  7. Python2.7 中文字符编码 & Pycharm utf-8设置、Unicode与utf-8的区别

    Python2.7 中文字符编码 & Pycharm utf-8设置.Unicode与utf-8的区别 zoerywzhou@163.com http://www.cnblogs.com/sw ...

  8. 从字符集发展史看Unicode和UTF-8的区别

    从字符集发展史看Unicode和UTF-8的区别 版权声明 本文并非本人原创,其内容来源于网络,本文根据其演绎而来,具体出出已经无法考证,在这里只好给出我所参考的连接. 知乎 https://www. ...

  9. 字符编码(续)---Unicode与ANSI字符串转换以及分辨字符编码形式

    Unicode与ANSI字符串转换 我们使用windows函数MultiByteToWideChar将多字节字符串转换为宽字符字符串,如下: int MultiByteToWideChar( UINT ...

随机推荐

  1. python JSON API duckduckgo search engine 使用duckduckgo API 尝试搜索引擎

    The duckduckgo.com's search engine is very neat to use. Acutally it has many things to do with other ...

  2. 分享一套 CodeSmit 代码生成模板。

    分享一套 CodeSmit 代码生成模板. 住博客园 5 年了,以前也发过一些博文,但都在 一天后 / 几周后 / 几年后 将它删了:因为感觉代码写得不好:不清晰或侵入太大,哪怕只有一句侵入. 可是最 ...

  3. cooking eggs

    1: what is egg? what's the shape of it in details? 2: can egg run like this http://item.taobao.com/i ...

  4. Ubuntu13.04使用Mesa

    3年前写过一些关于如何使用Mesa的文章,如今再试.有些东西已经变了. 首先安装: sudo apt-get install libgl1-mesa-dev sudo apt-get install ...

  5. get post 知多少

    GET与POST简介 POST和GET都属于http请求的方法,所以都包含开始行,头域,头域结束符,消息主体,但是,他们同样存在很多异同,为了更好的区别这两种请求,我们对他们的异同进行具体的分析. 表 ...

  6. linux下测试宽带速度

    speedtest-cli是一个用Python编写的轻量级Linux命令行工具,在Python2.4至3.4版本下均可运行.它基于Speedtest.net的基础架构来测量网络的上/下行速率.安装sp ...

  7. IdentityServer4 实现 OpenID Connect 和 OAuth 2.0

    关于 OAuth 2.0 的相关内容,点击查看:ASP.NET WebApi OWIN 实现 OAuth 2.0 OpenID 是一个去中心化的网上身份认证系统.对于支持 OpenID 的网站,用户不 ...

  8. Linux实战教学笔记10:正则表达式

    第十节 正则表达式 标签(空格分隔):Linux实战教学笔记 ---更多资料点我查看 第1章 什么是正则表达式 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法 通过定义的这些特殊符号的 ...

  9. Java ArrayList、Vector和LinkedList等的差别与用法(转)

    Java ArrayList.Vector和LinkedList等的差别与用法(转) ArrayList 和Vector是采取数组体式格式存储数据,此数组元素数大于实际存储的数据以便增长和插入元素,都 ...

  10. iOS开发-文件操作

    目录操作和文件管理 学习目标 1.理解单例 2.掌握NSFileManager类常用的文件管理操 3.掌握NSFileHandle类常用的文件数据操作 4.了解NSData类的常用操作 5.掌握Pli ...