本文共 1198 字,大约阅读时间需要 3 分钟。
一、乱码问题:
1、移动端提交的参数
使用http协议为移动端提供接口,android端直接可以传汉字,但是ios端,不允许直接传汉字, 所以移动端使用URLEncoder.encode编码,
引入java.net下面的包:import java.net.URLEncoder;
参数中有发票信息的参数, String invoice = “发票抬头:北京科技发展有限公司” ; invoice = URLEncoder.encode(invoice, "utf-8") ;
2、服务器接受的参数
服务器接收的参数,使用URLDecoder.decode解码 String invoice = request.getParameter("invoice") ; invoice = URLDecoder.decode(, "UTF-8"); 但是解码后的值是乱码:我的å‘票信æ¯%E5%8F%91%E7%A5%A8%E4%BF%A1%E6%81%AF 二、解决方法:
1、移动端提交的参数
移动端编码两次 String invoice = “发票抬头:北京科技发展有限公司” ; invoice = URLEncoder.encode(invoice, "utf-8") ; invoice = URLEncoder.encode(invoice, "utf-8") ; 2、服务器接受的参数
使用URLDecoder.decode解码一次 String invoice = request.getParameter("invoice") ; invoice = URLDecoder.decode(, "UTF-8"); 但是解码后的值是;发票抬头:北京科技发展有限公司 三、原因分析:
1、为什么进行两次编码?
第一次编码,使多字节字符,变成纯粹的ascii码; 第二次编码,为了和服务器接受时,框架中封装好的自动解码相抵消。 2、用一次为什么不行?
URLEncoder使用的是UTF-8来编码的, a、如果服务器端使用
request.getParameter("invoice") 接收时,容器也能够按照 UTF-8 解码的话,根本不用在移动端进行二次编码,使用完全一次就可以了。
b、如果服务器端使用request.getParameter("invoice"),
接收时,容器没有按照 UTF-8 解码的话,结果就会是乱码。
3、什么决定容器的解码格式?
a、request.setCharacterEncoding(“UTF-8”) ; b、服务器项目的配置 说明:
1、我的项目是按照GBK编码格式创建的,而移动端都是UTF-8编码格式,所以移动端要调用我的接口,就需要编码两次, 2、因为项目一旦更改编码格式,好多jsp都要跟着改,所以这里就只能不该了。
转载地址:http://brmgi.baihongyu.com/