文章目录▼CloseOpen
- 页面本身乱码?先把这两个地方改对
- 请求/响应乱码?这两步比改配置更直接
- POST请求乱码:先给请求“定编码”
- GET请求乱码:改Tomcat配置更省心
- 数据库交互乱码?这两个配置不能少
- 页面加了UTF-8的page指令,为什么还是乱码?
- GET请求乱码不想改Tomcat配置,有没有临时解决办法?
- 数据库用utf8不行吗?为什么要改成utf8mb4?
- Servlet返回中文响应时乱码,怎么办?
- 老版IE浏览器打开JSP页面乱码,怎么解决?
这篇文章就针对新手痛点,把复杂的编码逻辑拆成超简单的实用步骤:从页面本身的编码设置,到请求参数的编码处理,再到数据库交互的编码对齐,每一步都给“直戳问题核心”的解决办法。不用记复杂配置项,不用查晦涩原理,跟着做就能快速搞定90%以上的JSP中文乱码场景——毕竟对新手来说,“能立刻解决问题”比“搞懂底层逻辑”更刚需。赶紧往下看,把浪费在乱码上的时间抢回来!
你有没有过写JSP页面时的崩溃时刻?明明代码里的中文是对的,一运行全变成“???”或者一堆像乱码的符号,刷新十次都没用,查资料又全是“字符编码”“请求解码”这种复杂术语,越看越懵?我去年刚学JSP的时候也栽过这坑——帮朋友做一个简单的留言板,用户提交的昵称和留言存进数据库,全变成了“大家好”这种乱码,他盯着屏幕笑,我站在旁边脸都红了,心里骂自己怎么连这么基础的问题都搞不定。后来折腾了三天,问了学长、查了官方文档,终于摸透了几个“不用懂原理也能搞定”的笨办法,现在遇到乱码10分钟内准解决。今天就把这些亲测有效的技巧分享给你,全程说人话,跟着做就行。
页面本身乱码?先把这两个地方改对
其实90%的JSP新手遇到的第一个乱码问题,都是页面本身的编码没对齐。我刚开始写JSP的时候,总忘了在页面顶部加一句关键代码,结果打开页面全是乱码——比如写了个“用户登录”的标题,运行后变成“用户é登录”,差点把电脑摔了。后来问了做开发的表哥才知道,JSP页面需要在最顶部加page指令,指定编码格式:
这里的UTF-8
是核心——现在几乎所有浏览器、服务器和数据库都支持这个国际编码,能兼容所有语言。要是你用的是Eclipse或者IDEA这类IDE,还得检查文件本身的编码:比如Eclipse默认是GBK,就算加了page指令,保存后的文件还是GBK编码,打开肯定乱码。我之前就是这么踩坑的,后来在Eclipse的“Preferences→General→Workspace”里,把“Text file encoding”改成UTF-8,才彻底解决。
还有HTML里的meta
标签也不能忘!得在里加一句
——我朋友的电脑用的是老版IE浏览器,之前没加这个标签,页面乱码得没法看,加了之后立刻正常。其实这一步是帮浏览器“识别”页面编码,就像你跟人说话前先说明“我讲中文”,对方才不会误解你的意思。
对了,我还遇到过一种情况:改了page指令和meta标签,页面还是乱码,后来发现是IDE的“实时预览”功能搞的鬼——比如IDEA的“Preview”窗口有时候会缓存旧编码,关掉重新打开就好了。新手遇到这种情况别慌,先重启IDE试试,比查资料管用。
请求/响应乱码?这两步比改配置更直接
页面没问题了,但提交表单、传参数的时候又乱码?我做留言板时就遇到过这种情况:用户输入“我喜欢编程”,点提交按钮后,Servlet接收的参数变成“æå欢ç¼ç¨”,存进数据库更是一团糟。后来问了学长才明白,请求和响应的编码得单独处理,光改页面没用。
POST请求乱码:先给请求“定编码”
如果是POST方式提交表单(比如登录、留言这种需要输入内容的场景),得在Servlet获取参数之前加一句代码:
request.setCharacterEncoding("UTF-8");
划重点:这句话必须放在request.getParameter("xxx")
前面!我之前就是放错了位置——先获取了参数再设置编码,结果折腾了两小时都没好,差点哭出来。比如我做留言板的Servlet里,正确的顺序是:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第一步:设置请求编码(必须在获取参数前)
request.setCharacterEncoding("UTF-8");
// 第二步:获取参数
String username = request.getParameter("username");
String content = request.getParameter("content");
// 后面存数据库的逻辑...
}
这样处理后,用户输入的中文就能正确传给Servlet了。
GET请求乱码:改Tomcat配置更省心
如果是GET方式传参数(比如URL里带?id=1&name=张三
这种),POST的方法不管用——因为GET请求的参数是附在URL里的,Tomcat默认用ISO-8859-1
编码解析(这是个只支持英文的老编码)。这时候有两种解决办法:
ISO-8859-1
转成UTF-8
,比如: String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
但这种方法得每个参数都转,太麻烦,适合临时用;
server.xml
文件,在Connector
标签里加URIEncoding="UTF-8"
,比如:
这个方法一劳永逸,Tomcat 8及以上版本都支持。我去年帮同学改了这个配置后,他的GET请求再也没乱码过——毕竟能偷懒谁想写重复代码啊!
响应的编码也得注意:如果Servlet要返回中文内容(比如ajax请求),得加一句response.setContentType("text/html;charset=UTF-8");
,不然页面接收响应时又会乱码。比如我做过一个ajax验证用户名的功能,之前没加这句话,返回的“用户名已存在”变成乱码,加了之后立刻正常。
数据库交互乱码?这两个配置不能少
页面和请求都处理好了,但存进数据库还是乱码?我去年做留言板的最后一步就卡在这里——用户输入的内容明明在Servlet里是对的,存进MySQL后变成“????”,当时我都快放弃了,后来查了MySQL的官方文档才发现,数据库和JDBC连接的编码也得统一成UTF-8。
改MySQL的配置文件(Windows是my.ini
,Linux是my.cnf
),加两行代码:
[client]
default-character-set=utf8mb4 # 支持emoji等特殊字符
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
为什么用utf8mb4
而不是utf8
?因为MySQL的utf8
其实只支持3个字节,像emoji这种4字节的字符存不进去,会变成乱码。我朋友之前用utf8
存emoji,结果全变成“?”,改成utf8mb4
就好了。
然后,改JDBC连接字符串,在URL后面加编码参数:
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8
比如我连接留言板数据库的URL是:
jdbc:mysql://localhost:3306/message_board?useUnicode=true&characterEncoding=UTF-8
这一步是告诉JDBC驱动:“我要把数据用UTF-8编码传给数据库”,不然驱动会用默认的ISO-8859-1
,导致乱码。
检查数据库表的编码:新建表的时候,把“ collation”改成utf8mb4_unicode_ci
,比如:
CREATE TABLE message (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(20) NOT NULL,
content TEXT NOT NULL
) DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我之前就是没改表的编码,导致存进去的内容乱码,改了之后立刻正常——这一步新手很容易忘,一定要记下来!
为了方便你对照,我把常见的乱码场景和解决方法做成了表格,遇到问题直接查:
乱码场景 | 解决方法 |
---|---|
页面打开乱码 | 加page指令+meta标签,改IDE文件编码为UTF-8 |
POST请求乱码 | Servlet中加request.setCharacterEncoding(“UTF-8”)(放获取参数前) |
GET请求乱码 | 改Tomcat的server.xml,加URIEncoding=”UTF-8″ |
数据库乱码 | 改MySQL配置为utf8mb4,JDBC连接加编码参数 |
其实JSP中文乱码真的不是什么“技术难题”,就是几个关键环节的编码没统一——页面用UTF-8、请求用UTF-8、数据库也用UTF-8,相当于所有人都说同一种语言,自然不会有误解。我去年刚学的时候,以为要懂“字符集转换”“字节流解码”这些底层原理,后来发现只要把这几个地方改对,90%的乱码都能解决。
你要是按这些方法试了,欢迎回来告诉我效果——比如你之前遇到过什么奇葩的乱码场景?或者还有没搞定的问题,我帮你一起想想办法。毕竟学编程就是踩坑再填坑的过程,咱们互相搭个手,少走点弯路~
我之前遇到过好几个朋友问,说自己明明在JSP页面最上面加了,怎么打开页面还是一堆乱码?比如写了个“用户注册”的标题,运行后变成“用户é注册”,刷新十次都没用。其实问题出在你写的代码和IDE保存文件的编码没对齐——就像你明明跟别人说“我讲中文”,但自己偷偷用英文写纸条,对方肯定看不懂。page指令是告诉浏览器“我用UTF-8”,但IDE要是把文件保存成GBK(比如Eclipse默认就是GBK),那浏览器拿到的其实是GBK编码的文件,自然就乱码了。
你要是用Eclipse的话,就点顶部的Window→Preferences,然后找General→Workspace,在Text file encoding那里选UTF-8;要是IDEA,就点File→Settings,然后Editor→File Encodings,把Project Encoding和Default encoding for properties files都改成UTF-8。改完别忘点Apply或者OK,然后把原来的JSP文件重新保存一下——有些IDE会缓存旧编码,你得手动触发一下保存,不然改了设置也没用。还有个小细节要注意,有些朋友改了Workspace的编码,但项目本身的编码没跟着变,比如Eclipse里得右键项目→Properties→Resource,把Text file encoding也改成UTF-8,不然单独改Workspace,项目里的文件还是GBK编码,打开页面该乱码还是乱码。我之前帮同事调过这个问题,他改了Workspace但没改项目编码,结果折腾了半小时才发现,最后重新保存文件就好了。
还有人问过,说改了IDE设置,页面还是乱码怎么办?那你可以试试重启IDE——比如IDEA的实时预览窗口有时候会缓存旧编码,关掉重新打开,或者直接重启软件,比查资料管用。我自己就遇到过这种情况,改了编码设置,预览窗口还是乱码,重启IDEA后立刻正常。其实新手遇到问题不用慌,先试试最基础的“重启”,很多小问题都是缓存搞的鬼。
页面加了UTF-8的page指令,为什么还是乱码?
可能是IDE的文件编码没同步改。比如Eclipse默认用GBK保存文件,就算加了page指令,文件本身还是GBK编码,打开会乱码。解决方法:在IDE的设置里把“Text file encoding”改成UTF-8(比如Eclipse在“Preferences→General→Workspace”,IDEA在“File→Settings→Editor→File Encodings”),再重新保存文件。
GET请求乱码不想改Tomcat配置,有没有临时解决办法?
可以用“转码法”:把参数从ISO-8859-1(Tomcat默认的GET编码)转成UTF-8。比如获取用户名时写String username = new String(request.getParameter(“username”).getBytes(“ISO-8859-1”), “UTF-8”)。但注意这个方法要给每个GET参数单独处理,适合临时用,长期还是改Tomcat配置更省心。
数据库用utf8不行吗?为什么要改成utf8mb4?
MySQL的“utf8”其实是“伪utf8”——只支持3个字节的字符,像emoji(比如😀)、生僻字这类4字节的字符存不进去,会变成乱码。而“utf8mb4”是真正的UTF-8,支持所有字符,包括emoji,所以 优先用utf8mb4。
Servlet返回中文响应时乱码,怎么办?
要给响应“定编码”:在Servlet输出内容(比如response.getWriter().write(“中文”))之前,加一句response.setContentType(“text/html;charset=UTF-8”)。这句话会告诉浏览器“我返回的内容是UTF-8编码”,避免浏览器用默认编码解析导致乱码。
老版IE浏览器打开JSP页面乱码,怎么解决?
老版IE(比如IE8及以下)对meta charset=”UTF-8″的支持不好,可以换成兼容写法:。 确保JSP的page指令和IDE编码都是UTF-8,这样老IE也能正确识别页面内容。