一句话:浏览器浏览的页面编码一定要跟servlet中HttpServletRequest的编码一致,就不会有乱码,不一致就会乱码。当然服务器的处理编码方式也影响,tomcat9就是默认用了UTF-8处理,你就要用UTF-8开发
1、首先设置浏览器端的
html 设置页面的编码方式
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
写在head标签内,这样浏览器就会以UTF-8编码打开
jsp页面的设置
文件首行写:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
这样浏览器就会以UTF-8编码打开
ZC: 注意:源码文件(?.html、?.jsp 等),需要 保存为 UTF-8编码格式的文件。
2、设置servlet中HttpServletRequest端的编码
浏览器请求有三种方式,表单提交post,表单提交get,a标签超链接get
处理分两种:
i.表单提交post:
处理post函数首行写
request.setCharacterEncoding("UTF-8");
编码跟浏览器端一样UTF-8,一定要在使用request.getParameter(“username”)函数前写request.setCharacterEncoding(“UTF-8”);才有效果,之后写都没有用的
ii.表单提交get,a标签超链接get:
get请求方式在tomcat7之前处理tomcat服务器都是用ISO-8859-1处理数据
String str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
System.out.println(str);
TOMCAT8开始,tomcat服务器都是用UTF-8处理数据了,所以一般只要你的浏览器端指定了UTF-8编码,都不会乱码的,那有的人要使用GBK编码行不行呢?
不行,不行,不行,原因详文再谈java乱码:GBK和UTF-8互转尾部乱码问题分析该文章中的例子是UTF-8转GBK,而我们的是GBK转UTF-8,代码
package cn.hc;
public class Test4 {
public static void main(String[] args) throws Exception {
// 这是一个unicode字符串,与字符集无关
String str1 = "用户";
System.out.println("unicode字符串:" + str1);
// 将str转为GBK字节流
byte[] byteArray1 = str1.getBytes("GBK");
System.out.println(byteArray1.length);
// TOMCAT8开始定义UTF-8处理数据,将byteArray1当做一个普通的字节流,按照UTF-8解码为一个unicode字符串
String str2 = new String(byteArray1, "UTF-8");
System.out.println("转成UTF-8会乱码:" + str2);
// 将UTF-8编码的unicode字符串转回为byte[]
byte[] byteArray2 = str2.getBytes("UTF-8");// 数据会不会丢失呢?
// 重新用GBK解码
String str3 = new String(byteArray2, "GBK");
System.out.println("数据丢失:" + str3);
}
}
运行结果:
unicode字符串:用户
4
转成UTF-8会乱码:???
数据丢失:锟矫伙拷
所以tomcat8开始设置好html,jsp等的编码为UTF-8,get请求直接取得的字符串都不是乱码,但是为了兼容,还是处理一下
String str = new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
代码解说:
String username = request.getParameter("username");// 得到username乱码
byte[] usernameBytes = username.getBytes("ISO-8859-1");// 根据username乱码去ISO-8859-1拿到对应的码如98,99 \98,99就是浏览器以UTF-8发出的原始码
username=new String(usernameBytes, "UTF-8");//拿着98,99去UTF-8码表查询对应的文字构建字符串
也说明了我们开发只能用UTF-8编码,另本文只是测试了tomcat服务器,其他服务器未测试,当然你通过修改tomcat服务器的配置文件使得可以使用GBK编码那就另当别论了,一般不建议服务器配置文件的