字符集和编码
一.基础知识
计算机存储的所有信息都是用二进制表示的,包括我们看到的各种符号字符。将“字符”用二进制表示出来称为“编码”,将二进制信息转换成二进制01称为解码。
我们遇到的各种编码问题往往是使用一种方法编码,但是用了另外一种方式解码,有时不会出现问题是因为解码方式是编码方式的超集。
编码主要的差异是:
- 表示的字符集不同:有的很少,有的可以表示很多;
- 表示一个字符所用的字节数量不同;
- 表示字符的字节数量相同,但是同一个字符的表示方式可能不同;
字符集(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个字符。两个字符代码表如下:
值得注意的是:utf8、ISO-8859-1、gb2312、GBK等都是兼容ASCII的,
2.2 GBK及GBXXX
GBXXX是国家标准,为了适应中文字符,GBK是微软对GB-2312的一个扩充,也是windows系统使用的默认字符系统;
GB-18030兼容GBK,当然也兼容GB-2312,其特点如下:
- 同utf8,采用 多字节编码/可变字节,可由1/2/4个字节组成;
- 最多可定义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的详细规则如下:
- 128个US-ASCII字符只需一个字节编码(Unicode范围由ox0000至ox007F);
- 带有附加符号的拉丁文、希腊文等采用两个字节编码(Unicode范围由ox0080至ox07FF、[28-1-211-1]);
- 其他“基本多文种平面(BMP)”中的字符(这包含了大部分常用字)使用三个字节编码,比如中文;
- 其他极少使用的Unicode辅助平面的字符使用四字节编码;
utf-8的优点:
- utf-8不存在字节顺序(由于其前缀编码特性?)。
- 是ASCII的超集;
- utf8、utf16是可扩展标记语言xml的标准编码;
缺点:
- 寻找串中第N个字符是一个O(N)复杂度的操作
三.编程中的常见的编码标识
在http协议的请求头中,与字符集和字符编码有关的键值对有Accept-Charset/Content-Type
。其他相关键值对有:
- Accept-Charset:浏览器申明自己接收的字符集和字符编码,如gb2312,utf-8;
- Content-Type:web服务器告诉浏览器自己响应对象的类型和字符,例如
:Content-Type: text/html; charset='gb2312'
; - Accept-Encoding:浏览器声明自己接受的页面编码方式,示例
Accept-Encoding:gzip, deflate
,值前者指定了是否支持压缩,后者是默认编码 - Accept-language:浏览器声明自己接受的语言;
- Content-Encoding:服务器告诉浏览器响应对象使用了了什么压缩方法;
- Content-Language:服务器告诉浏览器相应对象语言;