一、乱码问题:
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都要跟着改,所以这里就只能不该了。