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


 



 


 

posted @ 2016-11-06 10:05  Super_cpp  阅读(440)  评论(0编辑  收藏  举报