request.getParameter乱码的原因

2024-04-01 09:58

本文主要是介绍request.getParameter乱码的原因,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http请求是以ISO-8859-1的编码来传送url的

如果页面的content-type为utf-8,那么在发送请求时,会将字符转成utf-8后进行传送

如“中”的UTF-8编码为:E4 B8 AD在请求时为%E4%B8%AD字节之间是%分隔

那么服务器收到这段字节流后,必须将它转成相应的字符,平时所使用的request.getParameter("name")直接得到了字符串,

那么从字节流到字符流这个过程系统己经帮助我们完成了(乱码的产生由此开始)

类似下面的程序:将汉字"中"的UTF-8形式转成汉字

public class EncodingTest {public static void main(String[] args) {String utf_string = "E4%B8%AD"; //中的UTF-8编码,三个字节表示,用%分开String[] utf_array = utf_string.split("%");byte[] utf_byte = new byte[utf_array.length];for (int i = 0; i < utf_array.length; i++) {utf_byte[i] = (byte) Integer.parseInt(utf_array[i], 16);}try {System.out.println(new String(utf_byte, "UTF-8"));} catch(UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}

请注意段代码:new String(utf_byte,"UTF-8")它将字节流以UTF-8的编码还原为字符串

但它使用的前提条件是utf_byte必须是utf-8的字节流,

如果这样:

String aa = "中";

bb = aa.getBytes("ISO-8859-1");

new String(bb ,"UTF-8")肯定是乱码了

也就是说一个字符串以什么样的编码转换成字节流,就必须以什么样的编码进行还原

bb=aa.getBytes("UTF-8")就必须new String(bb,"UTF-8")否则乱码

言归正传:

url通过iso-8859-1传输,服务器收到这个字节流,默认会以ISO-8859-1来将这个字节流还原成相应的字符串,

就如同这样:

客户端:bb = aa.getBytes("UTF-8");

到了服务器:cc = new String(bb,"ISO-8859-1")还原字节流为节符串

request.getParameter("");获取到这个cc,那么cc当然乱码了

所以就产生了这样的做法:new String(request.getParameter("").getBytes("ISO-8859-1"),"UTF-8")还原成原始字符串

将乱码字符串还原成原始的字节流,重新按UTF-8来编码.

至于在tomcat中更改URI-Encoding及使用过滤器,是用来更改将字节流转成字符串的编码

这篇关于request.getParameter乱码的原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/866864

相关文章

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis