简单了解字符与字符集

来源:互联网 发布:apache 安装 编辑:程序博客网 时间:2024/04/27 00:32

简单基础概念:

       Unicode 是字符集
       UTF-8是编码方式即保存方式
       char 和 wchar 是C++定一个的变量
       一个字节是8位即 00000000
       char 是 一字节
       wchar 是二字节

字符集和编码方式:

       字符集就是对字符的编号,类似于你的ID,同样一个人可以有不同的ID,比如身份证号,学好,工号等。
       编码方式就是如何表现或者说是存储这个编号。

当然最简单的方式就是直接保存编号,如ACSII:
       ACSII 编号范围是 0-125,所以一个字节即可表示,ACSII的编码方式就是直接存储编号,一个字节一个编号。
       但是其他的一些编码方式如果直接保存编号会造成空间的浪费,所以采用编码为的就是有效的利用空间资源,比如unicode:

Unicode 编号范围是 0-10FFFF,其编码方式就包含UTF-8,UTF-16等。

Unicode

       Unicode 是字符集 就是给每个字符排了个编号,编号范围是0-10FFFF,所以如果完整保存一个Unicode编码的话应该是3个字节。
下图是从维基百科上截取的部分编码:
这里写图片描述
       前面说过编号范围是0-10FFFF,为何这里都是2个字节表示呢,原因是Unicode 对编号做了分组Unicode将其称之为平面, 将最前一个字节作为组号,后两字节作为组员号,于是就有了0-10共16个平面,其中0平面叫做基本平面,大多数字符都位于0号平面,而且大多数时候采用Unicode字符集的时候默认都是使用0平面,这样表示一个Unicode字符的时候就是两个字节,正好是一个wchar变量。

UTF-8

       UTF-8是Unicode的一种编码方式,Unicode需要3字节保存一个字符,而基本字符都在0平面如果默认使用0平面则实际只需俩个字节,如果是英文用户则其实只需要1个字节。如果统一使用3字节的话实在是浪费空间,于是就有了编码方式,UTF-8就是其中一种,其他的还有像UTF-16等。具体如何转换参阅
http://zh.wikipedia.org/wiki/UTF-8

内容扩展GB2312 ,BIG5…:

       GB2312 和BIG5等等都是一个国家或者地区自己修订的字符集,他们是字符集与编码方式是二合一的,所以没有编码方式和字符集的区分,即直接存储的就是对应的编码,不像Unicode字符集可以使用UTF-8编码存储也可以使用UTF-16或者UTF-32存储,值得一提的是有个UCS编码方式直接就是使用Unicode字符编号做为编码,意思就是直接存储Unicode字符集序列。
       不过现在大多数网页直接支持显示UTF-8或者UTF-16编码的字符了,这就是造成混淆的原因,因为这使得UTF-8可以抛开Unicode变的好像自身就类似于GB2312这种二合一的字符集了。
UTF-8设计的意图本来是减小Unicode字符的数据传输量的,其结构如下图:
client(Unicode) ——–(utf-8)——>(Unicode)Service 但是由于广大用户的要求所以搞得浏览器直接支持utf-8了。

测试1

工具:
       系统自带记事本
       WinHex

首先新建一个文本文档,在其中输入一个中文和一个英文,如图
这里写图片描述
然后 文件->另存为 将其保存成不同编码方式的文件,我这里分别保存成了ANSI,UTF-8以及Unicode编码的格式。
这里写图片描述
使用WinHex分别打开这三个文件
这里写图片描述
这里写图片描述
这里写图片描述
       ANSI 保存成 41 CDF5,记事本中ANSI的保存规则是英文用ANSI保存中文用GB2312,这个规则会随系统版本不同有所变化。
       unicode 保存成 FFEE 4100 8B73, FFEE是记事本程序做的标记,一遍识别这是unicode格式保存的内容, 4100 8B73 都是省略了平面组号的组员号。实际编号为 0041 738B,这里存在字节序的问题。
       UTF-8 保存成 EFBBBF 41 E78E8B ,EFBBBF是识别标号,41是字符‘A‘ E78E8B 是字符‘王’

0 0