认识字符编码

270 阅读6分钟

基本概念

  1. 位(bit):又叫比特位,计算机表示数据传输的单位;
  2. 字节(byte):计量单位,计算机表示数据存储的单位;
  3. 字符:各种文字和符号的总称,如字母、数字、字和符号;
  4. 字符集:一个系统支持的所有抽象字符的集合,例如ASCII字符集,GB2312字符集,Unicode字符集;
  5. 字符编码:使字符集与其他进行外部程序配对的规则;例如ASCII编码,GB2323编码,Unicode编码,Utf-8编码(还是针对Unicode字符集的一种编码)
  6. 缓冲区:临时存储数据的空间
  7. 缓存:临时存储web组件,如网页,图像,或者其他web的多媒体,减少服务器延迟

字符与字节的关系

字符在计算机中占用的字节数取决于所使用的字符集和编码方式。不同的字符集和编码方式会为字符分配不同数量的字节

编码英文中文
ASCII1英文 = 1字节
GB23121英文 = 1字节1中文 = 2字节
UTF-81英文 = 1字节1中文 = 3字节
UTF-161英文 = 2字节1中文 = 2字节
UTF-321英文 = 4字节1中文 = 4字节

1字节(byte)等于8个比特位

1字节(byte)等于8个二进制位

1个16进制位 等于4个二进制位

1个字节(byte)等于2个十六进制位

image.png

字符编码

在计算机中,所有的信息都是二进制表示,我们需要让计算机正确表达我们的信息,就需要定制一种规则,这个规则定义了字符与二进制一一对应的关系,我们称这个规则为字符编码。一个字节有8个二进制位,那么,这8个二进制位可以组合出256种字符。

ASCII

ASCII共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个。标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。

image.png

比如:A 的二进制 是 01000001 ! 的二进制是 00100001

为了表示更多的欧洲常用字符对ASCII进行了扩展,ASCII扩展字符集使用8位(bits)表示一个字符,共256字符,下边是扩展字符集

u=3474425445,2378677407&fm=253&fmt=auto&app=138&f=GIF.gif

GB2312

ASCII 包含了英文大小写字符、阿拉伯数字和西文符号,但是没有中文,GB2312是中国国家标准的简体中文字符集,包含了我们常使用的汉字,基本满足了中文计算机 中的需求。

区位码:GB2312对所收录的字符分区分为管理,共94区,每个区有94个位,共8836个码位。 其中:

  • 01-09区收录除汉字外的字符(682个)
  • 10-15区 空白区
  • 16-55区收录一级汉字,按照拼音排序(3755个)
  • 56-87区收录二级汉字,按照部首/笔画排序(3008个)
  • 88-94区 空白区

GB2312收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。根据汉字的使用频率将汉字划分为常用汉字(一级汉字)和非常用汉字(二级汉字),GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个。

下图是16区和17区一级汉字的区位码对照:

image.png

国标码:为了避免与ASCII编码中的不可见字符(0x00~0x1F,即10进制的0~31)以及空格(0x20,即10进制的32)冲突,将区码和位码分别加上32(即16进制的20)作为“国标码”

机内码:这个国标码仍然与ASCII方案(编码范围是0x00~0x7F,即10进制的0~127)中的其它字符冲突,故又把国标码每个字节2进制的最高位都由0变成1,这相当于每个字节再加上128(即16进制的80),从而得到“机内码”

区位码、国标码、机内码的转换

汉字啊区位码是1601,将区位码转为十六进制为1001(16100101)
在ASCII中
区位码的十六进制表示 + 2020 = 3021(国标码)
3021(国标码) + 8080 = B0A1(机内码)(1+0=1,2+8=A,0+0=0,3+8=B)
Unicode

不同的国家有不同的字母,256种二进制表示,在不同国家可能对应不同的字符,这就需要计算机在解析时选择配套的字符编码解译。编码规则错误,就会出现乱码的现象。Unicode的出现,就是为了解决这一难题。它为每种语言中的每个字符设定了独一无二 的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode使用4字节的数字表示字符,标准始终使用十六进制数字,如耀,Unicode编码为8000+00 = 8000(\u80000),再比如育,编码为80A0 + 12 = 80b0(\u80b0)

image.png

查询其他字符编码 Unicode Table (tamasoft.co.jp)

UTF-8

UTF是 Unicode Tranformation Format,即把Unicode转做某种格式的意思,utf-8是unicode的使用方式之一,是一种针对Unicode的可变长度字符编码,UTF-8使用可变长度字节来储存Unicode字符,例如ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节

全角和半角

对于英文字母和标点符号需要区分全角和半角,原因是在ASCII中有定义英文字母和标点符号,GB2312中也定义了英文字母和标点符号,为了区分是哪个字符集的,就定义了全角和半角:

  • 全角:GB2312中的字符
  • 半角:ASCII中的字符