欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ascii vs unicode 博客分类: interview asciiunicode 

程序员文章站 2024-03-11 14:55:37
...

   

   在没有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("你好"));
相关标签: ascii unicode