ascii vs unicode 博客分类: interview asciiunicode
在没有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("你好"));
下一篇: javac -encoding 用法详解