浏览器会自动对url进行编码,不同浏览器用的编码集不同,可进行设置。
下列模拟请求后 服务端获取请求数据的 代码片段
private static void service(Socket socket) throws Exception {
//读取 HTTP 请求信息
InputStream socketIn = socket.getInputStream();
Thread.sleep(500); //当前线程休眠500毫秒
//返回从该输入流中可以读取(或跳过)的字节数的估计值,
//而不会被下一次调用此输入流的方法阻塞
int size = socketIn.available();
byte[] requestBuffer = new byte[size];
socketIn.read(requestBuffer); //输入流, 将读取到的字节存储到 字节数组中
String request = new String(requestBuffer,"iso-8859-1"); //request请求
}
参考上列代码:
- 数据是以二进制 流 的形式传输的
- 获得输入流
InputStream socketIn = socket.getInputStream();
- 读取流中的数据
socketIn.read(requestBuffer);
存到字节数组中 String request = new String(requestBuffer,"iso-8859-1");
构造一个新的Striing 根据 “iso-8859-1” 做解码操作
上面代码足以说明了乱码的前因后果 :
- 请求的get参数是用utf-8编码的
- tomcat默认是用iso-8859-1对uri和get参数进行解码
相当于
String request = new String(requestBuffer,"iso-8859-1")
这段代码,以iso-8859-1解码操作。此时直接输出会发现乱码。 - 根源:编码(utf-8),解码(iso-8859-1),不 统 一
解决方案
- 修改tomcat配置的解决方法:
修改配置文件server.xml<conntect URIEncoding="UTF-8"/>
,用utf-8对uri解码。 byte[ ] encode = "乱码字符”.getbytes("iso-8859-1");
将乱码的字符以 iso-8859-1 重新编码回去。
此时得到原始数据—(单纯以utf-8编码后的数据)
String decode = new String(encode,“utf-8”);
以utf-8进行解码操作。此时的到的数据就是编码之前的数据
编码(utf-8),解码(uft-8), 统 一 乱码问题解决!
编码:能看懂的字符——>二进制
例:byte[ ] encode = "喜”.getbytes(“utf-8”);
解码:二进制——>能看懂的字符
例:String decode = new String(encode,“utf-8”)
总结:出现乱码的根本原因就是 编码方式和解码方式不统一 !