几种字符集与LPTSTR、LPCSTR、LPSTR、LPCTSTR、LPWSTR、LPCWSTR的意义

本文详细介绍了字符集的概念,包括SBCS、ASCII、扩展ASCII、MBCS(DBCS)、GB2312、GBK、Unicode及其衍生的UTF-8编码。同时阐述了C++中LPTSTR、LPCSTR等字符串类型的含义,以及它们与不同字符集的关系,帮助理解字符编码和程序设计中的字符串处理。
摘要由CSDN通过智能技术生成
1、几种字符集:
所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组。字符类型有三种编码格式:
  • SBCS: 第一种是单字节字符集(single byte character set or SBCS)。在这种编码格式下,所有字符都只用一个字节表示。常见字符集有:ASCII码和扩展ASCII码。SBCS字符串由一个零字节结尾,数据类型是char。
    • ASCII码:计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。
      ASCII码由一个字节中的7位(bit)表示,最高位空着,范围是0x00 - 0x7F 共128个字符。他们以为这128个数字就足够表示abcd...ABCD...1234...这些字符了。
    • 扩展ASCII码:咳...说英语的人就是“笨”!后来他们突然发现,如果需要按照表格方式打印这些字符的时候,缺少了“制表符”。于是又扩展了ASCII的定义,使用一个字节的全部8位(bit)来表示字符了,这就叫扩展ASCII码。范围是0x00-0xFF共256个字符。

  • MBCS(multi-byte character set),又称ANSI编码:多字节字符集。由于Windows  里使用的多字节字符绝大部分是两个字节长,MBCS常被DBCS代替。它是不定长表示世界文字的编码。MBCS表示英文字母时就和ASCII一样(这也是我们容易把MBCS和ASCII搞混的原因),但表示其他文字时就需要用多字节。
    • GB2312、GBK等:等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国 人民,我们不客气地把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。中国人民看到这样很不错,于是就把这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。 但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。    后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符 集里的内容。结果扩展之后的编码方案被称为GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。     中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 "DBCS"(Double Byte Charecter Set双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处 理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。
    • 为了扩充 ASCII编码 ,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个 字节 来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为“MBCS(Muilti-Bytes Charecter Set,多字节字符集)”。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文 操作系统 下,ANSI 编码代表 JIS 编码, 所以在中文 windows下要转码成gb2312,gbk只需要把文本保存为ANSI 编码即可 。 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。一个很大的缺点是,同一个编码值,在不同的编码体系里代表着不同的字。这样就容易造成混乱。导致了unicode码的诞生。
    • 其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码。

  • UNICODE(Universal Multiple-Octet Coded Character Set 通用多八位编码字符集),宽字符集:标准的UNICODE字符集(即UCS-2,又称UTF-16) 规定用两个字节表示一个字符的方法。比如字符'A'在ASCII下面是一个字符,可'A'在UNICODE下面是两个字符,高字符用0填充,而且汉字'程'在ASCII下面是两个字节,而在UNICODE下仍旧是两个字节。UNICODE的用处就是定长表示世界文字,据统计,用两个字节可以编码现存的所有文字而没有二义。为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。Unicode字符数据类型有:WCHAR、_wchar_t、OLECHAR。

  • UTF:标准的UTF-16(即UNICODE)并不兼容ASCII编码(在基于ascii的编码方案中,一个8位的0x0总是表示一个字符串的结束的,而UTF-16则不然,它的一个字符完全有可能在高8位或者低8位上等于0x0,这会导致很多应用程序错误,尤其是在网络传输协议当中可能导致大量的字符串错误截断),且对可以用ASCII表示的字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间 ,为了兼容ASCII编码并方便数据的传输,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及 UTF-32。
    • UTF-8(8-bit Unicode Transformation
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值