HttpServletRequest中文乱码 post get tomcat9默认用了UTF-8编码

时间:2023-01-05 13:15:42

一句话:浏览器浏览的页面编码一定要跟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编码那就另当别论了,一般不建议服务器配置文件的