HttpServletRequest中文乱码 post get tomcat9默认用了UTF-8编码 新增get请求终极方案无视服务器编码类型

一句话:浏览器浏览的页面编码一定要跟servlet中HttpServletRequest的编码一致,就不会有乱码,不一致就会乱码。当然服务器的处理编码方式也影响,tomcat9就是默认用了UTF-8处理,你就要用UTF-8开发

1、首先设置浏览器端的
html 设置页面的编码方式

<meta charset="UTF-8"> 

<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请求直接取得的字符串都不是乱码,如果出现了乱码,可以用以下代码处理,当然你得确定你tomcat服务器的默认编码是不是ISO-8859-1

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编码那就另当别论了,一般不建议修改服务器配置文件的

新增get请求乱码终极方案:可以无视服务器的默认编码
以上的get请求的乱码处理方法都是需要知道服务器的默认编码类型来进行处理,但是如果换新服务器不知道它的编码呢怎么办?
方法:
页面端使用2次URL编码,服务端进行URL解码一次
一、web页面(有2中方式)
1、使用js的encodeURI来编码
encodeURI(encodeURI(“中国”));
2、是jsp里使用
<%=java.net.URLEncoder.encode(java.net.URLEncoder.encode(“中国”,”UTF-8”),”UTF-8”)%>
二、服务器端解码处理
String name=request.getParameter(“name”);
String strName=URLDecoder.decode(name, “UTF-8”);

原理详情我的另一博文https://blog.csdn.net/love20yh/article/details/80869339

你可能感兴趣的