编写此篇文章的原因:前端传递参数带加号时,到后端都被转换成了空格,对此问题比较疑惑,进行资料查找,发现编码方面比较薄弱,进行学习记录。
以上问题解决方法:
URLEncoder.encode("参数","utf-8");
URLDecoder.decode("参数","utf-8");
传递参数时进行编码,获取参数后进行解码
原因:到现在还比较迷茫,知道愿意请通知一声,谢谢
字符集与编码方式
字符集(二进制与字符的一一映射)
ASCII (最初的字符集)
GB2312--->GBK--->GB18030(各国字符集)
-
Unicode(统一字符集)
* 为了解决Unicode占用硬盘和流量大的问题产生了相关编码方式
- utf-8
- utf-16
url编码:
-
概念
参考:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81
URI中允许的字符分为保留字符和非保留字符(RFC 3986中规定的保留字符和非保留字符)
保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
非保留字符:AZ,az,09,-_.
如果一个保留字符在特定上下文中具有特殊含义 , 且URI中必须使用该字符用于其它目的, 那么该字符必须百分号编码.
!
#
$
&
'
(
)
*
+
,
/
:
;
=
?
@
[
]
%21
%23
%24
%26
%27
%28
%29
%2A
%2B
%2C
%2F
%3A
%3B
%3D
%3F
%40
%5B
%5D
-
使用
1.url中的PathInfo
实际的url路径编码方式由浏览器决定
2.url中的QueryString
实际的url路径编码方式由浏览器决定
3.get请求或post 请求Content-Type的值是:application/x-www-form-urlencoded
表单提交时,参数中中文的编码则根据HTML代码中指定的字符编码来决定(也就是html代码中<meta>标签指定的字符编码)。当然这是在form中没有指定
accept-charset
的情况下,如果form中加了accept-charset="GBK”
属性,则表单参数则由accept-charset
指定编码进行编码
Jsp/Servlet编码:
-
在jsp/servlet中主要有以下几个地方可以设置编码
-
pageEncoding="UTF-8"
- 设置jsp编译成servlet时使用的编码
- 例如:jsp文件保存为gbk格式,pageEncoding="UTF-8"时servlet会出现乱码
- JSP中不指定contentType参数,不使用response.setCharacterEncoding方法时,指定对服务器响应进行重新编码的编码
-
response
需要设置转换成传输流的编码方式及浏览器的解码方式
服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码。ISO-8859-1不支持中文即传输中文必须采用其他传输方式,否则为乱码
response.setCharacterEncoding("utf-8”);
设置服务器端的编码,默认是ISO-8859-1;该方法必须在response.getWriter()之前进行设置,如果设置了Content-Type字段,response.setCharacterEncoding方法设置的字符集编码会出现在Http消息的响应头中,会要求浏览器使用utf-8进行解码
response.setHeader("Content-Type", "text/html; ");
或response.setHeader("Content-Type", "text/html;");
通知浏览器服务器发送的数据格式是text/html,并要求浏览器使用utf-8进行解码。response.setContentType("text/html;charset=utf-8”);
或response.setHeader("Content-Type", "text/html; charset=utf-8”);
它其实会覆盖response.setCharacterEncoding("utf-8”) ,在开发中只需要设置response.setContentType("text/html;charset=utf-8”)就可以了。意思是通知浏览器服务器发送的数据格式是text/html,服务器采用utf-8编码,并要求浏览器使用utf-8进行解码。response.setCharacterEncoding("utf-8”);
设置服务器端的编码为utf-8
response.getWriter().println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>”);
要求浏览器使用utf-8进行解码,按照整个html格式编写,写在head中。
可以看出,第二种方式是最简便的,这也是我们在开发中最常使用的方式。setCharacterEncoding优先权比setContentType及setLocale()节点要高
-
request
会涉及到URL编程,参考url编码
在服务器端,通过request.setCharacterEncoding("utf-8”)即可设置服务器的解码为utf-8(默认是ISO-8859-1),但是它只对请求体里面的参数有效;如果参数跟在请求行中的uri后边,它就无能为力了。因此请求方式不同,解决乱码的方案也不同。
-
在地址栏直接输入URL访问
编码方式由浏览器决定,RFC 3986协议强制要求转换为UTF-8,为了方便处理,通过超链接和表单的访问也规定必须是utf-8格式,即显示当前页面的编码也要使用utf-8,这样浏览器将统一使用utf-8对参数进行编码
-
点击页面中的超链接访问
将参数按照当前页面的显示编码进行编码,RFC 3986协议强制要求转换为UTF-8。
-
提交表单访问
将参数按照当前页面的显示编码进行编码。
解决方案:
-
post请求
post方式属于表单提交,参数存在于请求体中,通过request.setCharacterEncoding("utf-8”)即可解决乱码。
-
get方式
get方式提交的参数会跟在请求行中的uri后边,服务器按照默认的iso-8859-1进行解码,这时候解决乱码有两种办法:
-
修改服务器端对uri参数的默认编码
在tomcat的server.xml中,设置<Connector ….>元素的属性URIEncoding="UTF-8”即可。(默认没有设置此属性)
注意:
1、设置<Connector ….>元素的属性useBodyEncodingForURI=“true”,意思是请求体和uri使用相同的编码格式。通过设置这两个属性,既可以解决get方式的乱码,又可以解决 post方式的乱码。
2、通过修改server.xml指定服务器对get和post统一按照utf-8解码,要求tomcat管理下的所有web应用都要使用utf-8编码,即所有的jsp、html页面都使用utf-8编码。比如 JSP页面的头信息是这样的:
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
-
参数从浏览器到服务器,经过客户端utf-8编码,服务器端iso-8859-1解码,最终成为乱码。那我们将乱码进行相反的编解码,即可得到正常的参数值。
例如:String name = request.getParameter("name”);//得到乱码
name = new String(name.getBytes("iso-8859-1"),"utf-8”);//得到正常的name值
注意:name.getBytes();如果不指定编码,默认按照gb2312进行编码。
-
-
-
-