字符集和编码

一.基础知识

计算机存储的所有信息都是用二进制表示的,包括我们看到的各种符号字符。将“字符”用二进制表示出来称为“编码”,将二进制信息转换成二进制01称为解码。

我们遇到的各种编码问题往往是使用一种方法编码,但是用了另外一种方式解码,有时不会出现问题是因为解码方式是编码方式的超集

编码主要的差异是:

  1. 表示的字符集不同:有的很少,有的可以表示很多;
  2. 表示一个字符所用的字节数量不同;
  3. 表示字符的字节数量相同,但是同一个字符的表示方式可能不同;

字符集(Charset):系统所支持的所有抽象字符符号的集合。
字符编码(Charset Encoding):一套将字符集与其他信息对应起来的法则,在计算机中指怎样将字符转换为01数字;

二.常用字符集和字符编码

常用字符集有:java使用的ISO-8859-1、主要用于表示英文并且URL使用的ASCII以及Unicode(对应编码方式为utf8、utf16和utf32);

2.1ASCII及其扩展EASCII

ASCII(american standard code for information interchange)主要用来显示英语,用7bit表示一个字符,因此只能表示128(包括0)个字符,其扩展版本EASCII用8bit表示,可以表示包含部分西欧语言的256个字符。两个字符代码表如下:

image

image

值得注意的是:utf8、ISO-8859-1、gb2312、GBK等都是兼容ASCII的,

2.2 GBK及GBXXX

GBXXX是国家标准,为了适应中文字符,GBK是微软对GB-2312的一个扩充,也是windows系统使用的默认字符系统;
GB-18030兼容GBK,当然也兼容GB-2312,其特点如下:

  1. 同utf8,采用 多字节编码/可变字节,可由1/2/4个字节组成;
  2. 最多可定义161万个字符;
2.3 Unicode和utf-x

首先需要明确:unicode是字符集,utf-8/16/32是字符编码方式,即怎样将unicode用计算机的二进制01表示出来

各个地区将本地化编码在互联网上相互访问时会出现乱码现象,为了统一编码方式发明了基于通用字符集的unicode。通用字符集由ISO指定,他们也有自己的字符集如java使用的ISO-8859-1。Unicode使用了4个字节表示字符,每个编码(数字)表示某种语言中的一个字符或符号。

2.3.1 UTF-32

采用固定字节编码:4个字节表示一个字符,可以再常数时间定位到字符串中的第n个字符。虽然方便但是占用空间较大而不如其他unicode编码方式用的广泛;

2.3.1 UTF-16

使用两个字节表示字符,空间效率是utf-32的两倍。
todo:不同的计算机系统会以不同的顺序保存字节

2.3.1 UTF-8

utf8(8-bit uincode transformation format)是可变长度字符编码,也是一种前缀码(一个代码可定不是另一个代码的前缀)。utf8可以表示unicode编码中的所有字符,并且编码中的第一个字节与ASCII兼容,他已经成为各种网络应用中优先采用的字符编码,IETF要求所有的互联网协议protocol必须支持utf8编码。

utf-8的详细规则如下:

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由ox0000至ox007F);
  2. 带有附加符号的拉丁文、希腊文等采用两个字节编码(Unicode范围由ox0080至ox07FF、[28-1-211-1]);
  3. 其他“基本多文种平面(BMP)”中的字符(这包含了大部分常用字)使用三个字节编码,比如中文;
  4. 其他极少使用的Unicode辅助平面的字符使用四字节编码;

utf-8的优点:

  1. utf-8不存在字节顺序(由于其前缀编码特性?)。
  2. 是ASCII的超集;
  3. utf8、utf16是可扩展标记语言xml的标准编码;

缺点:

  1. 寻找串中第N个字符是一个O(N)复杂度的操作

三.编程中的常见的编码标识

在http协议的请求头中,与字符集和字符编码有关的键值对有Accept-Charset/Content-Type。其他相关键值对有:

  1. Accept-Charset:浏览器申明自己接收的字符集和字符编码,如gb2312,utf-8;
  2. Content-Type:web服务器告诉浏览器自己响应对象的类型和字符,例如:Content-Type: text/html; charset='gb2312';
  3. Accept-Encoding:浏览器声明自己接受的页面编码方式,示例Accept-Encoding:gzip, deflate,值前者指定了是否支持压缩,后者是默认编码
  4. Accept-language:浏览器声明自己接受的语言;
  5. Content-Encoding:服务器告诉浏览器响应对象使用了了什么压缩方法;
  6. Content-Language:服务器告诉浏览器相应对象语言;

posted on 2018-04-21 14:07  coderDu  阅读(233)  评论(0编辑  收藏  举报