JSP页面中文乱码

「已注销」 2019-10-28 10:21:17
传入


request.setAttribute("message", "用户名" + user + "已经被占用,请重新填写!");
request.getRequestDispatcher("/newUser.jsp").forward(request, response);



接收


<%
request.setCharacterEncoding("UTF-8");
Object msg=request.getAttribute("message");
if(msg!=null){
out.print("<br>");
out.print(msg);
out.print("<br>");
out.print("<br>");
}
%>


试了下post和get请求乱码的解决方案,失败了
试了下字符串转码,又失败了(ISO-8859-1 ---> utf-8)
JSP页面的contentType、pageEncoding、浏览器显示编码一致,都是UTF-8

虽然强行解决这问题比较容易,但略显僵硬,请教一下诸位大佬,解决转发后中文乱码的正常操作
...全文
396 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
转眼便江湖 2019-11-06
  • 打赏
  • 举报
回复
上一个页面表单提交方式是不是post,不是post用request.setCharacterEncoding("UTF-8")是不行的
guishuanglin 2019-11-01
  • 打赏
  • 举报
回复
你自己多研究一下, 这个是要开发环境, 文件编码, 页面设置, 整个保持一样才能解决问题.
guishuanglin 2019-10-31
  • 打赏
  • 举报
回复

request.setAttribute("message", "用户名" + user + "已经被占用,请重新填写!");
request.getRequestDispatcher("/newUser.jsp").forward(request, response);

//输出如果用utf-8, 应改成:
request.setAttribute("message", "用户名" + new String(user.getBytes("utf-8"), "utf-8") + "已经被占用,请重新填写!");
request.getRequestDispatcher("/newUser.jsp").forward(request, response);

guishuanglin 2019-10-31
  • 打赏
  • 举报
回复
上面的代码是把任何类型的编码 转换成 utf-8, 与你系统用什么编码无关, 你的想法与你实现不一样.
「已注销」 2019-10-31
  • 打赏
  • 举报
回复
除了user全是乱码(jsp页面不做处理直接打印),转user拼起来也是一样的

String msg = new String("用户名".getBytes("utf-8"), "utf-8") + user +
                    new String("已经被占用,请重新填写!".getBytes("utf-8"), "utf-8");
            request.setAttribute("message", msg);
            request.getRequestDispatcher("/newUser.jsp").forward(request, response);
除了“名”这个字之外无乱码

String msg = new String("用户名".getBytes( ), "utf-8") + user +
                    new String("已经被占用,请重新填写!".getBytes( ), "utf-8");
            request.setAttribute("message", msg);
            request.getRequestDispatcher("/newUser.jsp").forward(request, response);
直接传user,在jsp页面拼串----->无乱码
「已注销」 2019-10-31
  • 打赏
  • 举报
回复
引用 26 楼 guishuanglin 的回复:
正确的方式是: 只打印 new String(str.getBytes("utf-8"), "utf-8");
1、user不用转换都是对的,我已经强调很多次了,user本来就是utf-8的编码,转他干嘛呢,当然把utf-8转成utf-8也没什么问题 2、我当然知道msg有多种编码,第一张图的两个例子只是说传参与不传参结果不同,后面两个例子第一个按你的思路执行,把user转码再和另外两个拼起来,第二个把另外两个转码,和user拼起来(这都是在转发之前实现的),这两个例子都是在getBytes中传入了参数,结果都出了问题,但是如果我不给getBytes传参数,第二个例子使用的方法就不会乱码(事实证明,转发之前的字符串若是utf-8编码,在jsp页面中不加处理直接打印绝不乱码,那既然乱了,显然我没有转码成功) 3、我很认同你对getBytes传参作用的看法,但是上述第二个例子却让我感觉很不对,传了就乱,不传不乱
guishuanglin 2019-10-31
  • 打赏
  • 举报
回复
说多了你也晕, 慢慢积累经验吧. 编码问题是开发程序的一个典型问题. 只能告诉你经验: 1, 开发工具总编码集要设置好, 2, 工程中每一类文件要手动指定编码, java,jsp在同一个工程中可能编码是不同的, 统一一样. 3, 对于拿到的任何外部字符, 只要转换你开发工具中设置的编码, 而不是系统中的编码. 其实你上面的内容很明显两种不同的编码 混在同一个字符串msg中, 所以你无论用什么转换, 都有一部分出错. 只要解决源头保证所有字符内容编码一样, 才能解决显示问题.
guishuanglin 2019-10-31
  • 打赏
  • 举报
回复
引用 25 楼 與蘤舊縐 的回复:
按你的说法应当是getBytes传入参数,方法按照传入的参数将无论一开始是什么字符集编码的字符串用参数指定字符集解析为字节数组,然后String的构造方法才可以生成对应编码的字符串,那么以上结果似乎是指传入的参数应当是一开始字符串的编码字符集,然后拿这个解码,再由构造函数按指定字符集编码 搞晕了
1,你不觉得 user 转换成的名称是对的吗? 2,你并没有用我的代码单独处理 user字符, 你用的是msg变量里面包含 user值. 这个msg里面有多种编码, 用 msg.getBytes("utf-8") 怎么可能正确? 正确的方式是: 只打印 new String(str.getBytes("utf-8"), "utf-8");
「已注销」 2019-10-31
  • 打赏
  • 举报
回复
按你的说法应当是getBytes传入参数,方法按照传入的参数将无论一开始是什么字符集编码的字符串用参数指定字符集解析为字节数组,然后String的构造方法才可以生成对应编码的字符串,那么以上结果似乎是指传入的参数应当是一开始字符串的编码字符集,然后拿这个解码,再由构造函数按指定字符集编码 搞晕了
「已注销」 2019-10-31
  • 打赏
  • 举报
回复
引用 21 楼 guishuanglin 的回复:
上面的代码是把任何类型的编码 转换成 utf-8, 与你系统用什么编码无关, 你的想法与你实现不一样.
我大概得纠正一下~~ 以下结果都在getBytes方法中传入了参数 这是你的代码的结果转的user 这是转另外两段字符串的结果 那么情况就又有点不妙了 不传参数的结果上面有,只有一点小问题,大部分显示正常
「已注销」 2019-10-31
  • 打赏
  • 举报
回复
引用 22 楼 guishuanglin 的回复:

request.setAttribute("message", "用户名" + user + "已经被占用,请重新填写!");
request.getRequestDispatcher("/newUser.jsp").forward(request, response);

//输出如果用utf-8, 应改成:
request.setAttribute("message", "用户名" + new String(user.getBytes("utf-8"), "utf-8") + "已经被占用,请重新填写!");
request.getRequestDispatcher("/newUser.jsp").forward(request, response);

你和我写的并没有区别,平台默认的编码就是utf-8,getBytes传不传参数没差 之前我理解有点误差,另外确实有点想不通的问题,既然平台的默认编码就是utf-8,那么这三个串的编码本来就一样(user这个字符串的编码本来就是utf-8),为什么三个串拼起来之后,如果一起转码,要么user乱码,要么另外两个乱码,既然三个串的编码都是utf-8,那根本不用转码,但其实不行,要说平台的编码不是utf-8,那getBytes不传参数和传参数效果不同,但事实是一致的(我指的是在控制台试,在jsp页面上不一样)
「已注销」 2019-10-30
  • 打赏
  • 举报
回复
我的意思是如果没有那一步的话,拼串的三个字符串编码不同,无法在jsp页面统一转码 另外无论是到jsp页面转码还是在转发前转码都还有一个问题,最后一个字可能乱码,比如“用户名已被占用”,则“用”字乱码,而“用户名已被占用了”就没有一个字乱码
「已注销」 2019-10-30
  • 打赏
  • 举报
回复
引用 10 楼 lmx8757921 的回复:
new String("用户名称".getBytes(), StandardCharsets.UTF_8) 这种写法没有必要,getBytes是按操作系统编码的
如果不这样,字符串的编码并不是utf-8,也不是Unicode,也不是GBK,也不是ISO8859-1,我都试过了,话说我也不知道他怎么回事 我这么做不过是想在转发之前把字符串编码统一为utf-8,因为在jsp页面解决不了乱码问题
lmx8757921 2019-10-30
  • 打赏
  • 举报
回复
new String("用户名称".getBytes(), StandardCharsets.UTF_8) 这种写法没有必要,getBytes是按操作系统编码的
程序yang 2019-10-30
  • 打赏
  • 举报
回复
「已注销」 2019-10-30
  • 打赏
  • 举报
回复
getBytes方法的参数应该是把字符串转成字节的编码,你这样写的字符串依旧是使用系统本身编码
guishuanglin 2019-10-30
  • 打赏
  • 举报
回复
引用 17 楼 與蘤舊縐 的回复:
其实可以只传user,到jsp页面拼串,不过感觉不符合设计模式,另外依旧不够灵活 求一劳永逸的方案
你试试上面的代码
guishuanglin 2019-10-30
  • 打赏
  • 举报
回复
把字符转成utf-8正式姿势是:

String str = "用户名称";
String b = null;
b = new String(str.getBytes("utf-8"), "utf-8");

「已注销」 2019-10-30
  • 打赏
  • 举报
回复
其实可以只传user,到jsp页面拼串,不过感觉不符合设计模式,另外依旧不够灵活 求一劳永逸的方案
「已注销」 2019-10-30
  • 打赏
  • 举报
回复
引用 15 楼 那杯热咖啡 的回复:
[quote=引用 14 楼 與蘤舊縐 的回复:] [quote=引用 13 楼 那杯热咖啡 的回复:] jsp标头加这个<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>试试
前面写了,这些都没问题 如果是get和post请求中获取字符串是不会乱码的,这个已经设置好了 这个是转发,没找到相关的统一解决方案,转码确实能解决问题,但是太麻烦了,另外还有这种难以理解的bug~~令人捉急[/quote] 在后台的方法里加 response.setContentType("text/html;charset=utf-8"); 试试[/quote] 页面本身就声明了这一条,另外我还是试了,没得用
加载更多回复(11)

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧