字符编码

字符编码

ASCII

  1. 一共128个字符的编码
  2. 占七位的bit位,最前面的一位统一为0

ISO-8859-1

  1. 扩展的ASCII编码,对 1000 0000 ~ 1111 1111 这一段进行了编码,总共能表示256个字符
  2. 但仍然无法表示中文

GB2312

  1. 是第一个汉字编码国家标准共收录汉字6763个,其中一级汉字3755个,二级汉字3008个

  2. 同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符

  3. 编码原理

    1. 分为94个区,每个区对应94个码位则 GB2312的编码范围为 0101~9494 (十进制)
      1. 01-09区 收录除汉字外的682个字符
      2. 10-15区为空白区,没有使用。
      3. 16-55区收录3755个一级汉字,按拼音排序。
      4. 56-87区收录3008个二级汉字,按部首/笔画排序。
      5. 88-94区为空白区,没有使用。
    2. 加上0xA0 即为 GB2312实际编码值 二进制编码范围为 0xA1A1~0XFEFE
    3. GB2312采用双字节编码, 高字节表示区位,低字节表示码位
  4. example

    1. ‘李’ 的区位码是3278 ,32区78位, 转换成 十六进制 0x204E, 加上0xA0 = 0xC0EE
  5. 汉字码位与码点查询

    https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php

BIG5

  1. BIG5采用双字节编码,高位字节使用了0x81-0xFE,低位字节使用了0x40-0x7E,及0xA1-0xFE

  2. 是繁体中文字符集编码,共收录13060个中文字,其中有二字为重复编码,即“兀、兀”(A461及C94A)和“嗀、嗀”(DCD1及DDFC)

  3. 具体分区

    8140-A0FE 保留给使用者自定义字符(造字区)
    A140-A3BF 标点符号、希腊字母及特殊符号。其中在A259-A261,收录了度量衡单位用字:兙兛兞兝兡兣嗧瓩糎。
    A3C0-A3FE 保留。此区没有开放作造字区用。
    A440-C67E 常用汉字,先按笔划再按部首排序。
    C6A1-F9DC 其它汉字。
    F9DD-F9FE 制表符。
    

GBK

  1. GBK编码扩展了GB2312,完全兼容GB2312编码,不兼容BIG5编码

  2. 编码范围

    8140-FEFE,剔除xx7F码位,共23940个码位,

    共收录汉字和图形符号21886个,其中汉字(包括部首和构件)21003个,图形符号883个

ANSI

  1. 在winodws平台 对于英文文件是ASCII编码,对于简体中文文件是GB2312编码
  2. 在繁体中文Windows操作系统中,ANSI编码代表Big5;
  3. 在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码
  4. 不同 ANSI 编码之间互不兼容

Unicode

Unicode简介

  1. Unicode是一张表,规定了每个字符对应二进制的值

  2. Unicode表包含了1114112个码点,即从000000(十六进制) - 10FFFF(十六进制)

  3. Unicode将码空间划分为17个平面, 从 00-10(十六进制),最高位的一个字节,每个平面有65536个码点,即两个字节

    1. 基本多语言平面(Basic Multilingual Plane)码点从 0000~FFFF,包含了最常用的字符
      1. 其中从D800到DFFF之间的码位区段是永久保留不映射到字符的
    2. 其他平面称为辅助平面(Supplementary Planes)
  4. Unicode只是一个符号集,只规定的字符所对应的码点,并没有指定如何存储

  5. unicode码点表

    https://unicode-table.com/cn

UCS(Universal Character Set)

UCS-2
  1. 定长二个字节编码, 0000~FFFF 对应的码点范围 对应第一个Unicode平面
  2. 采用BOM(Byte Order Mark)机制,该机制作用如下:
    1. 确定字节流采用的是大端序还是小端序。
    2. 确定字节流的Unicode编码方案。
UCS-4
  1. UCS-4是定长字节的,固定使用4个字节进行编码。也采用了BOM机制。

UTF-8(Unicode Transformation Format)

  1. UTF-8是一种变长编码方式,使用1-4个字节进行编码

  2. 完全兼容ASCII

  3. 编码规则

    1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码

    2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    3. unicode范围以及 对应UTF-8编码方式

      Unicode范围(十六进制位数)十进制范围二进制范围UTF-8编码方式UTf-8实际可编码的位数
      0000 0000 ~ 0000 007F0~1271-70xxx xxxx
      (ASCII编码范围)
      7
      0000 0080 ~ 0000 07FF128~20477-11110x xxxx 10xx xxxx11
      0000 0800 ~ 0000 FFFF2048~6553511-161110 xxxx 10xx xxxx 10xx xxxx16
      0001 0000 ~ 0010 FFFF65536~111411116~2111110xxx 10xx xxxx 10xx xxxx 10xx xxxx21
    4. Unicode规定从 0000~FFFF 为基本多语言平面,故 前三个字节为 BMP平面

  4. 举例

    1. '我’的 Unicode码 6211(十六进制)
      1. 根据范围占三个字节
      2. 6211的二进制为 110 001000 010001
      3. 将’我’二进制代码从低位到高位依次填入x中,不足的填入0
        1. UTF-8编码位: 11100110 10001000 10010001
        2. UTF-8编码的十六进制为 E6 88 91

UTF-16

  1. UTF-16使用2或4个字节编码

  2. 编码规则

    1. 若Unicode码点在第一平面(BPM)(0x0000 ~ 0xFFFF)中,则使用2个字节进行编码。
    2. 若Unicode码点在其他平面(辅助平面)(0x01 0000~0x10 FFFF),则使用4个字节进行编码。
      1. 首先减去 0x01 0000 得到二个字节 最大值为 0x 0F FFFF,共20位有效位数
      2. 取高十位 扩充成 二个字节, 高十位的取值 为 D800 ~ DBFF
      3. 取低十位 扩充成 二个字节,低十位的取值 为 DC00 ~ DFFF
      4. 组合四个字节即为UTF-16编码
    3. 识别大端 还是小端 be,le
      1. 在文件前加入FE FF 采用大端序(大端在前的顺序)
      2. 则在文件前加入FF FE 采用小端序(小端在前的顺序)
  3. 举例

    1. ‘我’ 字的Unicode码 6211(十六进制) 位于基本平面 所以取原值 6211

    2. 位于补充集得字符字符

      1. unicode编码 0x01 0001
      2. 减去01 0000 , 得 0x 0 0001
      3. 高字节 : 0 + D800
      4. 低字节: 1 + DC00 = DC01
      5. UTF-16得编码为:D800 DC01 (大端模式)
      6. 小端模式 00D8 01DC
    3. 下图为实际所得

      1. 大端
        在这里插入图片描述
      2. 小端
        在这里插入图片描述

参考链接

  1. https://www.qqxiuzi.cn/zh/hanzi-gb2312-bianma.php
  2. https://www.cnblogs.com/leesf456/p/5317574.html
  3. https://www.qqxiuzi.cn/bianma/zifuji.php
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值