0%

乱码处理笔记

#编码问题
##1:各种编码介绍
###1.1:ascll码

1
2
3
共128个,用一个字节的低七位表示,
0~31是控制字符换行、回车、删除相关的字符
32~126是输出字符,就是可以同过键盘输入并且输出的

###1.2:iso-8859-1

1
2
共256个字符.是基于ascll来扩展的的。
还是单字节编码

###1.3:gb2312(信息技术中文编码集)

1
2
3
4
共682个符号、6763个汉字,
编码范围是A1~F7,
A1~A9 共682个,是符号区,
B0~F7 共6763个,是汉字区。

###1.4:gbk(汉字内码扩展规范)

1
2
3
4
扩展gb2312,编码范围是8140~FEFE(去除XX7F),
共23940个码位,表示21003个汉字,
完全兼容gb2312.
在系统中应用较为广泛

###1.5:gb18030

1
2
3
是中国的强制标准,
可能是单字节、双字节、四字节.
完美兼容gb2312

###1.6:utf-16(统一码)

1
2
3
4
5
6
iso创建的超语言字典,
世界上所有语言可以通过字典来进行翻译。
utf-16 采用定长表示方法,无论什么字符读用两个字节表示
一个字节8bit,所以叫utf-16
java内存就是用utf-16来作为内存的字符存储格式
缺点:任何字符都是两个字节,增大存储成本和传输成本

###1.7:utf-8(最常用编码)

1
2
3
4
5
6
    utf-8采用的是变长技术,避免了utf-16缺点,每个编码区域有不同的字码长度。
不同的字符可以由1~6字节组成。
编码规则:
1):如果是一个字节,最高位(也就是第8个bit)为0,表示这个字符就是ascll字符
2):如果是一个字节,开头是11连续的1的个数表示这个字符的字节数,例如1110xxxx就是三个字节的utf-8的首字节
3):如果是一个字节,以10开始,这个就不是首字节,需要向前查找首字节

###1.8总结

1
2
3
4
平常使用也就是gb2312、gbk、utf-8常见
为了尽量避免乱码。优先选择utf-8
如果不在乎磁盘可以选择utf-16毕竟解析比utf-8简单
如果是网络IO的话 还是选择utf-8比较好 网络IO 字节流完整性容易遭到破坏 导致乱码

##2:javaweb常见编码问题
###2.1: http请求前后的乱码

1
2
3
4
5
6
7
8
  一般一次http请求中涉及到的编解码 存在于 request编码、request解码、response编码、response解码。
这样的可以通过设定http请求头、响应头、服务器编解码设置、客户端编解码设置来处理
例如:tomcat配置文件server.xml
<Connector port="8090" protocol="HTTP/1.1"
maxThreads="150" connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8" />
http中请求报头或者响应报头设置charset=utf-8
客户端也就是浏览器一般是默认utf-8编码 也可以自己去指定编码

###2.2: 数据库和项目之间出现乱码

1
2
3
主要就是项目中编解码和数据库的编解码、编码设置
一般直接设置链接参数 :jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8
一般项目直接设置utf-8 数据库也设定utf-8

###2.3: 总结

1
2
3
4
5
6
7
8
9
10
一般出现乱码肯定是有io的地方要么是各种链接之间 要么是系统内部出现来不同的编码
例如http请求 先确定乱码产生地点是在客户端还是服务端 是在那个环节产生的
一般进行一些简单的抓包分析看看旧大概知道是那个地发出现乱码了
检查报头 和客户端 服务端的解析编码集

出现乱码先一步步的缩小范围找到出现乱码的节点 看是那个地发设置出了问题
然后找到是什么导致这个节点这个设置出现问题
如果是有网络IO的话 可以尝试抓包分析
如果是本地IO的话 就看看系统编码、项目编码、等设置
尽量避免使用框架、各种软件、系统的默认设置

###2.4:form表单提交数据乱码

1
2
3
4
5
有时候组合页面的时候和遇到类似ie这种变态浏览器的时候 会遭遇form表单乱码问题 其他地方都设置合适编码了
这个时候在form中制定form表单的编码即可
<form accept-charset="utf-8" onsubmit="document.charset='utf-8'" >
后面那个onsubmit是遇到ie这种变态浏览器需要加的
最后 可能是服务器uri编码集未设定 例如tomcat的server.xml中的设置

###笔记参考书籍:深入javaweb技术内幕