泪眼成诗

导航

UNICODE与ANSI的区别

 帮同学写个播放音乐的代码,用的是vs2005,本来调用下API中的mciSendSrring()就很容易解决,后发现老是有warning:

incompatible types - from 'char [49]' to 'LPCWSTR' 当时也就认为是warning,没太在意。运行后发现 无法播放,连错误信息都是乱码。后查阅LPCWSTR 为何物,看到UNICODE 与ANSI字符集,不解,进而,查阅UNICODE与ANSI相关信息,终于发现了问题,原来是字符集的错误导致程序的乱码!vs2005默认是UNICODE 编码,vc是ANSI编码! 以下转载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]; 

    UNICODE:wchar_t    str[1024];

可用函数
   ANSI:即char,可用字符串处理函数:strcat(    ),strcpy(    ),    strlen(    )等以str打头的函数。  
   UNICODE:即wchar_t 可用字符串处理函数:wcscat(),wcscpy(),wcslen()等以wcs打头的函数。

 

      在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;  
   否则LPTSTR被定义为LPSTR   
   typedef    LPTSTR   LPSTR;  

原文地址:http://yzbaron.blog.163.com/blog/static/170977420096289148845/
这里还有一篇讲的不错的文章:地址http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html 有助于比较全面的理解。

 

posted on 2010-09-25 16:13  泪眼成诗  阅读(205)  评论(0编辑  收藏  举报