`
zhb8015
  • 浏览: 377269 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

ascii vs unicode

阅读更多

   

   在没有UNICODE之前,美国人发明了计算机,因为他们用的是英语,所以采用ASCII编码基本ASCII码可以包含[0-128)个字符,基本上囊括了所有的英文字母。然后扩展ASCII码[128-255]又可以表示英文的制表符、部分音标等等其他的一些符号,足够满足计算机使用了。     随着时间的推移计算机发展到了世界,ASCII处理英文自然是没有问题,但是处理中文、日文、阿拉伯文,就力不从心了,于是各个国家开始定义自己的编码规范,我们中文就是GB2312-80,其实就是利用扩展ASCII没有真正标准化这一点,用两个扩展ASCII码代表一个中文字符65536自然也就够用了。但是问题还是有的,比如很多软件利用扩展ASCII码来画表格,这种扩展ASCII码软件到中文系统中就会被误认为中文,产生乱码。

    于是UNICODE应运而生了,他用两个字节表示一个字符,当然他只是用两个字节空间存储一个字符一种编码方式。所有的字符(中文、英文、日文)都被2个字节处理。

  • 使用UNICODE的好处

   支持多种语言有利于程序国际化。

   winnt内部使用UNICODE编码,如果你的程序调用WINAPI传进去的是ASCII的话winnt会首先把UNICODE->ASCII.反之。可见用UNICODE不需要进行转换,提高了程序效率。

  • C++对UNICODE的支持

    ANSI C对宽字符的支持,

  宽字符的定义

    typedef unsigned short wchar_t;

  常量宽字符串

      wchar_t *str1=L" Hello";

  宽字符串库函数

    size_t __cdel wcslen(const wchar_t*);

  ANSI/Unicode通用编程

    tchar.h的部分摘抄

    #ifdef  _UNICODE
        typedef wchar_t     TCHAR;
        #define __T(x)      L##x
        #define _T(x)       __T(x)
    #else
        #define __T(x)      x
        typedef char            TCHAR;
    #endif

  • win32 api对UNICODE的支持

   宽字符的定义(winnt.h)

        typedef char CHAR; 
        typedef unsigned short WCHAR;    // wc,   16-bit UNICODE character 
        typedef CONST CHAR *LPCSTR, *PCSTR;

      ANSI/Unicode通用编程

        #ifdef  UNICODE 
            typedef WCHAR TCHAR, *PTCHAR;
            typedef LPWSTR LPTCH, PTCH;
            typedef LPWSTR PTSTR, LPTSTR;
            typedef LPCWSTR LPCTSTR;
            #define __TEXT(quote) L##quote      // r_winnt
        #else   /* UNICODE */               // r_winnt
            typedef char TCHAR, *PTCHAR;
            typedef LPSTR LPTCH, PTCH;
            typedef LPSTR PTSTR, LPTSTR;
            typedef LPCSTR LPCTSTR;
            #define __TEXT(quote) quote         // r_winnt
        #endif /* UNICODE */                // r_winnt

  • 使用 C++和WIN32 API进行UNICODE编程

         ANSI操作函数以str开头,如strcpy(),strcat(),strlen();
        Unicode操作函数以wcs开头,如wcscpy,wcscpy(),wcslen();
        ANSI/Unicode操作函数以_tcs开头 _tcscpy(C运行期库);
        ANSI/Unicode操作函数以lstr开头 lstrcpy(Windows函数);
        考虑ANSI和Unicode的兼容,我们需要使用以_tcs开头或lstr开头的通用字符串操作函数。

  • 创建VC 6.0的UNICODE工程

       VC 6.0默认使用ANSI,在Project ->Settings里面

       修改两个地方 

        1.将于处理器定义(Preprocessor definitions)删除_MBCS,加上_UNICODE,UNICODE(中间用逗号隔开)。

        2.将函数入口点更改为wWinMainCRTStartup。

  • 注:平时写程序多用通用(ANSI/UNICODE)的函数。使用_T宏,使用UNICODE编码。例如MessageBox(_T("你好"));
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics