计算机中存储的基本单元是字节,1字节=8bit,能表示的字符范围是0~255
编码方式:
ASCLL码:总共128个,1字节的低7位表示,0~31是控制字符,如换行回车删除;32~126是打印字符,可以输入并显示
ISO-8859-1:包含大部分西欧语言字符,仍然是单字节编码,可表示256个字符
GBK:汉字内码规范,可表示21003个汉字
UTF-16:用两个字节来表示Unicode的转化格式,采用定长的表示方法,不论什么字符都可以用两个字节表示,两个字节就是16bit,两个字节可以表示一个字符,大大简化了字符串操作,这也是java使用UTF-16作为内存的字符存储格式的一个很重要的原因
UTF-8:UTF-16的缺点,定长,占用空间大,占用网络带宽;UTF-8采用变长的技术,每个编码区域都有不同的字码长度,不同的字符可由1到6个字节组成
UTF-8的编码规则:
如果是一个字节,最高位为0,表示这是一个ASCLL字符,可见ASCLL编码已经是UTF-8了
如果是一个字节,以11开头,连续的1的个数暗示这个字符的字节数,110XXXX代表双字节
如果是一个字节,以10开始,表示他不是首字节,需要向前查找才能得到当前字符的首字节
GBK编码:字符占一个字节,汉字占两个字节
UTF-16:字符,汉字都是占两个字节
UTF-8:字符占一个字节,汉字占三个字节
UTF-16相较UTF-8:
UTF-16更浪费空间,采用顺序存储,无法对单个字符的编码值进行校验,中间一个字符码值损坏,后面的码值都将受影响
UTF-16编码效率高,字符到字节转换更简单,适合本地磁盘和内存之间使用,进行字符到字节的快速切换;但是不适合网络传输,损坏以后难以恢复,UTF-8更适合
URL的编解码:
浏览器编码URL是将非ASCLL字符按照某种编码格式编码成16进制数字后将每个16进制表示的字节前加%;
解码时tomcat服务器配置,<Connector URIEncoding="UTF-8" useBodyEncodingForURI="true" />
常见问题: