Servlet查看提交表单数据乱码解决方法

问题描述

在html代码中,input的name设置为中文,采用utf-8编码,且在文本输入框中输入中文。

在控制台打印name和value均产生乱码

bug截图

html代码
 <meta charset="UTF-8">
<tr>
	<td><label for="user" >用户名</label></td>
	<td><input type="text" name="用户名" id="user"></td>
</tr>
<tr>
	<td><label for="pwd" >密 码</label></td>
    <td><input type="password" name="密码" id="pwd"></td>

</tr>
<tr>
	<td>性别</td>
	<td><input type="radio" name="性别" checked>男<input type="radio" name="性别" >女</td>
</tr>
java代码
		Map<String,String[]> stringMap = req.getParameterMap();

        Set<String> keySet = stringMap.keySet();

        for(String key:keySet){

            String value=req.getParameter(key);

            System.out.println("key:"+key+" , value:"+value);
        }
浏览器界面截图

问题分析及解决

分析

该问题应该是解析request的编码和正确的编码不一致导致的

解决方案

方案1

通过new String(request.getBytes("iso-8859-1"),"utf-8");

代码模拟

 		//正常情况
		String str="汉字";
        byte[] b1=str.getBytes();
        for(byte b:b1){
            System.out.print(b);
        }//-26-79-119-27-83-105
        System.out.println(str);//汉字

		//将相同的字符串以 iso-8859-1 编码存储,此时出现乱码
        String str1=new String("汉字".getBytes("utf-8"),"iso-8859-1");
        byte[] b2=str1.getBytes();
        for(byte b:b2){
            System.out.print(b);
        }//-61-90-62-79-62-119-61-91-62-83-62-105
        System.out.println(str1);//汉字
		
		//getBytes(String charsetName): 
		//使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
		byte[] b3=str1.getBytes("iso-8859-1");
        for(byte b:b3){
            System.out.print(b);
        }//-26-79-119-27-83-105
        String str2=new String(str1.getBytes("iso-8859-1"),"utf-8");
        System.out.println(str2);//汉字

解决方法

  Map<String,String[]> stringMap = req.getParameterMap();

        Set<String> keySet = stringMap.keySet();

        for(String key:keySet){

            String value=req.getParameter(key);
            key=new String(key.getBytes("ISO-8859-1"),"utf-8");
            value=new String(value.getBytes("ISO-8859-1"),"utf-8");

            System.out.println("key:"+key+" , value:"+value);
        }

方案2
 req.setCharacterEncoding("utf-8");
		req.setCharacterEncoding("utf-8");
          
        Map<String,String[]> stringMap = req.getParameterMap();

        Set<String> keySet = stringMap.keySet();

        for(String key:keySet){
            String value=req.getParameter(key);
            System.out.println("key:"+key+" , value:"+value);
        }

posted @ 2022-05-28 12:50  性感的章鱼哥  阅读(144)  评论(0)    收藏  举报