JavaWeb基础学习中处理中文乱码(踩过的坑)

CXF客户端乱码 CXF动态调用客户端乱码 在使用CXF与其他系统对接时,发现对方系统响应的汉字乱码,在自己本地测试就没有问题,很奇怪,乱码如下: 由于不知道问题所在,只能在CXF动态调用的客户端代码上加IN 和 OUT拦截器,查看请求和响应,代码如下: //获取cxf客户端 JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance(); Client client = clientF 阅读详情

JavaWeb学习中处理中文乱码

在JavaWeb学习当中,常常会遇到中文乱码问题,为了正常显示我们所需要的内容,我们必须要对他进行转码处理。

在web环境中,我们的get请求编码是ISO-8859-1,我们的中文字符编码是UTF-8,若使用默认的字符编码,则会导致乱码问题。

下面我们分两个Tomcat版本进行测试

7版本如下
在这里插入图片描述

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>Test</servlet-name>
        <servlet-class>TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Test</servlet-name>
        <url-pattern>/test</url-pattern>
    </servlet-mapping>
</web-app>

get请求中:

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Student</title>
</head>
<body>
<form action="/test">
    姓名:<input type="text" name="name"><br/>
    性别:<input type="text" name="gender"><br/>
    学历:<input type="text" name="grade"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

Servlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        String name=req.getParameter("name");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

运行结果如下:

前端发送中文信息:

在这里插入图片描述

收到的是乱码

在这里插入图片描述

通过get请求拿到数据是ISO-8859-1编码,如果我们不做任何处理,这时候,我们传回去的也是ISO-8859-1,而浏览器设定了UTF-8识别,所以当然会乱码

contentType="text/html;charset=UTF-8"

如何解决?

get方法中我们只需要将拿到的参数进行转码即可。

(req.getParameter("xxxx").getBytes("ISO-8859-1"),"UTF-8");

例如我们只将name进行转码:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        String name=new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

发送一样的数据

在这里插入图片描述

结果如下:
在这里插入图片描述

我们只需要用(req.getParameter(“xxxx”).getBytes(“ISO-8859-1”),“UTF-8”);就可以将指定的字符串成功转码了。

但要注意的是Get请求中用setCharacterEncoding(“UTF-8”);并不能成功转码,

Servlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        String name = req.getParameter("name");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

运行结果如下:

在这里插入图片描述

Post请求:

在这里插入图片描述

指定发送Post请求,Servlet里doPost方法拿数据

同样发送相同信息至Servlet,只对name进行转码,结果与get请求相同

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        String name=new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

运行结果如下:
在这里插入图片描述

注意:Post请求就可以不需要一个一个转码这么麻烦了。可以直接使用setCharacterEncoding(“UTF-8”);方法统一处理

Servlet

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
        String name = req.getParameter("name");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

运行结果如下:
在这里插入图片描述

由此可见:

在7版本的猫猫中,get请求的乱码是要用一个个转码的,(req.getParameter(“xxxx”).getBytes(“ISO-8859-1”),“UTF-8”);,,并不能使用使用Post请求中setCharacterEncoding(“UTF-8”)的方法进行转换,而post请求中,可以用req.getParameter(“xxxx”).getBytes(“ISO-8859-1”),“UTF-8”);进行设置,但我们更喜欢用setCharacterEncoding(“UTF-8”)进行统一设置,从前端取进来要设置一下request,Servlet传出去也要设置一下respone。这样即可解决转码问题。

9版本如下

在这里插入图片描述

前端数据不变,发送Get请求,Servlet如下,我们只对name进行处理

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();
        String name = new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        String gender = req.getParameter("gender");
        String grade = req.getParameter("grade");
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

运行结果如下:

在这里插入图片描述

有意思的来了,会发现,结果刚好相反。设置了转码却乱码了,没设置的却显示正常。

而在post请求中却又是正常逻辑显示

在这里插入图片描述

为什么呢???

百度了一下:因为8版本以上的猫猫已经对get请求的ISO-8859-1进行了转换,如果我们再进行转换,就会有相反结果。

验证:

前端发送get请求,Servlet如下:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=UTF-8");
//        req.setCharacterEncoding("UTF-8");
//        resp.setCharacterEncoding("UTF-8");
        PrintWriter out = resp.getWriter();
//        String name = req.getParameter("name");
//        String name = new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
        String gender = req.getParameter("gender");
        System.out.println(gender);
        String grade = req.getParameter("grade");
        System.out.println(grade);
        out.println("<html>");
        out.println("<head><title>xxxxxxx</title></head>");
        out.println("<body>");
//        out.println("姓名:" + name + "</br>");
        out.println("姓别:" + gender + "</br>");
        out.println("学历:" + grade);
        out.println("</body>");
        out.println("</html>");
    }
}

控制台输出结果如下:

在这里插入图片描述

此时并没有对get请求的任何信息做处理,直接拿到正常的中文。

试一下Post,结果如下:

在这里插入图片描述

在这里插入图片描述

说明8版本以后的Tomcat确实对Get请求字符编码先进行了处理,而Post请求并没有做处理。

post请求中的处理只需要调用setCharacterEncoding(“UTF-8”)方法即可

总结:

综上,8版本以上猫猫的get请求传入Servlet已经是UTF-8,可以正常显示,我们只需要处理响应的编码和post请求的传入传出即可,若对get还进行转码,本身转好的UTF-8又转回去了,所以乱码。

8版本以下猫猫的请求未被做任何处理,需要自己手动转码。

看看自己的猫猫版本的多少,不要踩坑!!!!!

JavaWeb之Response——重定向与解决中文乱码问题 1)HttpServletResponse 概述 我们在创建 Servlet 时会覆盖 service() 方法,或 doGet()/doPost(),这些方法都有两个参数,分别是代表请求的 request 和代表响应 response。(今天我们主要来说说 response) service 方法中的 response 的类型是 ServletResponse,而 doGet/doPost 方法的 response 的类型是 HttpServletResponse,HttpServletRespons 阅读详情

相关推荐

【JavaWeb】Tomcat服务器,JSP基本语法,request请求对象,response响应对象,中文乱码问题

JavaWeb笔记 day01 2019/9/4 周三 学习内容: 标题

hanne_lovegood的博客 643

Java Web中文乱码,解决方法!!

本编文章列举了Java Web编程中所有可能导致中文乱码的问题以及解决方法

m0_70470868的博客 1万+

javaweb项目JSP加载静态资源出现中文乱码

*强调内容*javaweb项目JSP加载静态资源出现中文乱码 首先介绍自己在编码方面遇到的一乱码问题:jsp页面加载时,加载中文名的静态资源,出现乱码,自然就获取不到请求资源,无法加重了,jsp页面是没有乱码的。但是后台配置了编码过滤器的,为什么还会乱码呢? 网上搜索答案,虽然找到了解决问题的方法,但是没有理解原因。首先先看看乱码的解决方案http://blog.youkuaiyun.com/haiti

rediscover self-confident 2849

webService 使用CXF出现编码 GBK 的不可映射字符问题解决

使用CXF出现编码 GBK 的不可映射字符问题解决 webService 之间进行通信时,发送Document 控制台会出现乱码问题 后来打包在Linux系统中就不会出现这个问题,而在Windows中就会出现,经过不断的查询资料发现 *在 Windows 系统的使用 CXF 动态客户端时可能会遇到 tomcat 启动后调用 wsdl 遇到 很多错误GBK编码,这个错误的原因是 由于项目 maven 配置使用 UTF-8 的,CXF 生成java 文件是使用的UTF-8 的编码,而使用javac 编译的时候

weixin_44990295的博客 2024

DotNetZip [解决了文件名称中文字符不显示的问题]

从网上下载了的压缩组件:DotNetZip! 保存中文名称的文件时,要么名称显示不全,要么就显示若干个问号! 经过修改,已解决了这个问题,现共享给大家!! 相关文档: http://blog.youkuaiyun.com/redleaf1995/archive/2009/10/22/4712369.aspx

dotnet-一款高性能敏感词非法词脏字检测过滤组件

一款高性能敏感词(非法词/脏字)检测过滤组件,附带繁体简体互换,支持全角半角互换,汉字转拼音,模糊搜索等功能。支持.net standard 2.0

JavaWeb开发中Request中文乱码的解决

JavaWeb开发中Request中文乱码的解决 (自己学习总结,勿喷。): 针对POST 一开始就设置: request.setCharsetEncoder(“UTF-8”)我擦 或者针对于每一个getParameter(key),都这样写: String username = request.getParameter(key); byte [] buf = username.getBytes(...

qq_42210656的博客 578

AIStarter避坑指南:Wan2.2 Animate整合包从下载到出片的完整流程(附常见错误修复)

本文提供了Wan2.2 Animate整合包从下载部署到生成高清视频的完整避坑指南。详细解析了通过AIStarter启动、环境配置、核心参数调优以及七大常见错误(如CUDA内存不足、节点缺失、视频模糊等)的根因与修复方案,帮助用户高效利用ComfyUI工作流,稳定生成720P高质量AI动画视频。

weixin_29052717的博客 703

java接收表单值乱码_Javaweb接收表单数据并处理中文乱码的方法

Javaweb接收表单数据并处理中文乱码的方法发布时间:2020-07-23 09:16:23来源:亿速云阅读:105作者:小猪这篇文章主要讲解了Javaweb接收表单数据并处理中文乱码的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。前端表单数据常见的表单项的传值,如:普通input单选radio多选checkboxselect下拉选择textarea文本域普通 ...

weixin_39517797的博客 394

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现

PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现 BRDF简介 再介绍BRDF之前我们要引入渲染方程这个东西: 其中L表示辐射率,其公式为: 它表示了一个拥有辐射强度Φ的光源在单位面积A,单位立体角ω上的辐射出的总能量。 辐射率是辐射度量学上表示一个区域平面上光线总量的物理量,它受到入射光线与平面法线间的夹角θ的余弦值cosθ的影响:当直接...

小龙虾的博客 1万+

SAP打印错位问题终极解决指南:LP01设备格式设置全流程

本文详细解析了SAP系统中LP01设备打印错位问题的解决方案,重点介绍了SPAD事务码的配置流程和格式设置技巧。通过精准调整输出设备、设备类型和格式类型的匹配关系,有效解决'未定义格式'错误,确保打印内容准确对齐。文章还提供了高级排查方法和预防措施,帮助SAP管理员提升打印管理效率。

weixin_29311017的博客 390

java中中文乱码_解决javaWEB中前后台中文乱码问题的3种方法

中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方法。方法一:tomcat的自带编码是ISO-8859-1的格式,是不兼容中文的编码的。所以我们从后台接收的时候要注意。采用相同的格式去接收(ISO-8859-1),然后用能解析的编码(utf-8)去转换。这样我们就能得到能兼容中文的格式了。这样处理之后发往前台...

weixin_29146313的博客 1767

Rocky Linux 9.2:利用LVM动态调整/home与/根分区空间分配

本文详细介绍了在Rocky Linux 9.2系统中,如何利用LVM(逻辑卷管理器)动态调整/home与根分区(/)的空间分配。针对根分区空间不足而/home分区闲置的常见问题,文章提供了从检查磁盘布局、备份数据、卸载分区、调整逻辑卷大小到重建文件系统的完整操作步骤,并重点说明了XFS与EXT4文件系统在缩容时的不同处理方法,帮助系统管理员安全、在线地实现存储空间的灵活调配。

weixin_29271263的博客 177

SpringMVC系列十: 中文乱码处理与JSON处理

SpringMVC系列十: 中文乱码处理与JSON处理

你好, 我在学java的博客 1255

[LaTeX] 调整参考文献的格式(References),包括作者名缩写,行距,字体,引用顺序等等

在此记录我对LaTeX中参考文献references的尝试,主要涵盖如题几个方面。

the Blog of 等不到天亮丶等时光 4万+

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

【SemiDrive源码分析】【X9芯片启动流程】11 - freertos_safetyos目录Cortex-R5 DIL2.bin 引导程序源代码分析

|~~~热爱生活、努力学习的小伙汁~~~| 2107

java request乱码处理_javaWeb request乱码处理

//解决get方式提交的乱码Stringname = request.getParameter("name");name=new String(username.getBytes("iso8859-1"),"utf-8");//解决post方式提交的乱码request.setCharacterEncoding("utf-8");Stringname = request.getParameter...

weixin_31018573的博客 327

车载 ECU 中的 Safety Linux 详解

车载 ECU 中的 Safety Linux 详解

天赐好车的博客 307

Intellij IDEA 编译JavaWeb项目时控制台出现中文乱码的解决方法

用于解决Intellij IDEA 编译JavaWeb项目时控制台出现中文乱码的几种方法,很全,亲测有效

m0_55129871的博客 2610

OpenClaw实战系列01:OpenClaw接入飞书机器人全接入指南 + Ollama本地大模型

通过 OpenClaw + Ollama + 飞书的组合,我们成功搭建了一个完全私有、免费、可定制的AI助理。它不仅能在日常聊天中提供帮助,还能通过OpenClaw强大的“技能”体系,真正去操作你的电脑、管理文件、甚至执行代码。这套方案将数据留在本地,既保证了隐私安全,又锻炼了动手能力。现在,去给你的AI助理添加更多酷炫的技能吧!

PeterPan的博客 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java web乱码问题_如何解决JavaWeb乱码问题

作为一个合格的web开发人员应该是什么问题都遇到过的,尤其是乱码问题。大家也许都体会到了,我们中国人学编程,很大的一个不便就是程序的编码问题,无论学习什么技术,我们都需要探讨他的编码问题。今天来讲一下关于解决javaweb乱码出现的原因与解决办法,欢迎大家交流指正。首先,先明确两个问题,为什么会出现乱码?我们在编写web应用时什么时候会出现乱码?第一个问题:很多初学者会发现,我们在自己的客户机上编...

weixin_36267615的博客 5062

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

解决Servlet请求中的中文乱码问题,详解

从原理上去分析servlet接收中文参数出现乱码的原因及解决方案,从而提升大家的编程水平。知其然亦要知其所以然。

ZGJLZL的博客 5715

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

中文乱码处理全方案(2025年9月最新)

中文乱码处理全方案:针对不同项目类型提供解决方案。1)纯JavaWeb项目使用自定义过滤器处理POST请求乱码;2)Spring/SpringMVC项目配置内置CharacterEncodingFilter;3)SpringBoot项目可通过application.properties快速配置。文章对比了自定义过滤器与Spring内置方案的区别,推荐根据项目类型选择最佳实践,并附有测试效果图。同时提供相关技术专栏推荐。

业精于勤,荒于嬉 1460

JavaWeb是什么?如何学习JavaWeb的体系

java语言是当前最流行的开发语言之一。它的风格十分接近C++语言,是一个纯粹的面向对象的程序设计语言。Java继承了C++语言面向对象技术的核心,舍弃了C++语言中复杂和一些容易出错的特性,并在内存管理方面得到了增强。 web是指Internet 的图形、多媒体部分。万维网(环球网)(World Wide web)简称Web。Web 由众多Web 页组成。要浏览Web,可使用称为Web 浏览器的程序。参见“Internet”和“Web 页”。 java web 是指有Java语言开发出来可以在万维网上访问

Aa112233aA1的博客 4213

关于JavaBean获取中文乱码问题

最近重新学习了一下JavaWeb的一些基础知识,今天在学习JavaBean时遇到了一个中文的乱码问题。当JavaBean获取表单中的数据有中文时就会出现乱码的现象。原因大概是因为MyEclipse对Java文件的默认编码是iso8859-1,而我们在jsp中的编码设置一般为utf-8,所以在获取中文时必然会出现乱码的现象。 其实解决的方法很简单,只需要我们在Getter方法中用getBytes(

Joea的专栏 4100
下一篇: 如何使用配置文件快速搭建一个maven项目(IDEA版)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值