Windows编程一之字符集编码
字符集来源:
1985年,微软发布的windows 1.0中,自带一种字符编码,称为ANSI字符集,因为它是基于ANSI和ISO标准,但是ANSI只是由8位编码来表示,因为英文只有26个英文字母以及一些标点符号等,最多可以表示2^8=256个字符,当涉及到国际化的时候,这256个字符,明显是不能用来表示所有语言了,这就出现了Unicode编码——一个字符由16位来表示。
各种编码联系与区别:
ASCII:American Standard Code for Information Interchange,美国信息互换标准代码 一共8位, 7位有效位加一位奇偶校验位。主要针对拉丁文。包含26*2个英文字母,0~9的表示以及一些特殊符号的表示,在10进制的表示下,数字0为48,大写字母A为65,小写字母a为97.
ANSI:AMERICAN NATIONAL STANDARDS INSTITUTE,美国国家标准学会,美国国家标准协会,是作为ASCII的扩展,可以这么认为,ANSI的前128个字符和ASCII一样,但是ANSI取消了奇偶校验位,将最后一位也用来做有效位,ANSI只是一种标准。比如中文的ANSI标准为GB2312。日文好像是JP.
在不同的操作系统中,对于字符集的要求也是不一样的有的操作系统只支持多字节字符集,有的操作系统只支持宽字节字符集。但是大多数操作系统两种字符集都能支持。
一般来说,在多字节字符集中,一个ASCII字符只占一个字节,而中文,日文等象形文字,一个字符占用两个字节。
比如:char str[]="adc测试";
那么strlen(str)=7 sizeof(str)=8.
在宽字节字符集中,每个字符都占两个字节。ascii前面补充0x00。每次查找都是每来个字节查找(结束符\0 00 00)
wcstrlen("abc测试")=10; sizeof(abc测试")=12;
那么,在Winodows编程的时候,怎么能够兼容不同的操作系统呢,比如同样一段代码,在不修改的前提下,怎么使得在只支持单字节字符和只支持宽字节字符的时候,都能使用呢?
在C++ tchar.h头文件中,有一段宏:
大概是这样的
<pre name="code" class="html">#ifdef _UNICODE #define _tcslen wcslen #define TCHAR wchar_t #define LPSTR wchar_t #define _T(x)L##x #else #define _tcslen strlen #define THCAR char #define LPTSTR char* #define _T(x) x #endif