编码和解码
- 字符和字节之间经过编码与解码的方式相互转换
- 最基本的字节为ascii码和unicode码,unicode包括ascii码,可以表示更多的字符,unicode通常用两个字节表示一个字符
- 如utf-8 ,某个字符对应的unicode码为两个字节,但可以转换为多个字节utf-8的表示,然后根据这种表示,映射到对应的字符;故当字节数据不符合utf-8格式,则根据该数组转换字符时,会出现不可映射字符;
- 一般编码中,不可映射字符会用一个固定的字符来表示,故当字节数据转换为字符后,且字符中存在不可映射字符,该字符串无法被映射为原本的字节数据
- 当字符串可以正确的保存为字节后,如成功的保存为文件;则该文件无论以何种编码方式进行编码,都可以进行乱码后的恢复
- unicode兼容ascaii码,对于ascaii码,等同于没有编码规则
Unicode编码
- Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制,在前面加上U+。例如:“马”的Unicode是U+9A6C。
- Unicode码只是一种映射关系,等同于一种概念抽象,实际的存储以unicode码为基础,有多种实现,每种实现的存储形式各不相同;故gbk格式存储的文档不可以直接转换为utf-8格式
- Unicode就相当于一张表,建立了字符与编号之间的联系
- unicode使用两个字节表示字符的一种映射关系,只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。
- 编号到二进制有多种方案:主要有UTF-8,UTF-16,UTF-32,gbk等
- utf-8:
- UTF-8就是使用变长字节表示,顾名思义,就是使用的字节数可变,这个变化是根据Unicode编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。使用的字节个数从1到4个不等。
- 英文一个字节,中文三个字节,存在部分字符使用四个
- UTF-16使用变长字节表示
- 对于编号在U+0000到U+FFFF的字符(常用字符集),直接用两个字节表示。
- 编号在 U+10000到U+10FFFF之间的字符,需要用四个字节表示
- UTF-32
- 用四个字节表示,处理单元为四个字节(一次拿到四个字节进行处理)
- gbk 使用2个字节
ASCII码介绍
- ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。
- 到目前为止共定义了128个字符
- 用于将字符转换未二进制码
- ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符
- 通过一种通用的标准,使信息可以传入,一种二进制序列会被 识别未相同的结果
- ASCII码表大致可以分三部分组成:
- ASCII非打印控制字符
- ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。例如,12代表换页/新页功能。此命令指示打印机跳到下一页的开头。(参详ASCII码表中0-31)
- ASCII打印字符
- 数字 32–126 分配给了能在键盘上找到的字符,当您查看或打印文档时就会出现。数字127代表 DELETE 命令。(参详ASCII码表中32-127)
- 扩展ASCII打印字符
- 扩展的ASCII字符满足了对更多字符的需求。扩展的ASCII包含ASCII中已有的128个字符(数字0–32显示在下图中),又增加了128个字符,总共是256个
- 拓展的部分,不同国家的实现不相同
- 汉字使用了两个字节,仅256位不够使用(详见百科)
- ASCII非打印控制字符
- ascii码可以直接等同于字符使用,Unicode码需要具体的编码实现;char类型的值可以直接赋值ascii码值来表示对应的英文字符
BASE64介绍
- 由于某些系统中只能使用ASCII字符。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。(如unicode码)
- 可以将ascaii码中的拓展部分转换位基础通用部分(当信息在不同位置传输时,若部分机器对不可见字符的处理不同,会造成信息的失效)
- base64特别适合在http,mime协议下快速传输数据。
- Base64编码方法要求把每三个8Bit的字节转换为四个6Bit的字节,其中,转换之后的这四个字节中每6个有效bit为是有效数据,空余的那两个 bit用0补上成为一个字节。
- 会将原数据扩大三分之一
转换为16进制
- 对于生成的字节数组,一个字节转换为两个16进制的表示,长度可能会扩大一倍、
- 可以将无法表示的字节数组转换为可以表示的形式(加密生成的字节数组,不按照编码规则,无法生成文字)