ajax post或者get 传参时中文问题

[size=large]既然是ajax传参中文问题,我们第一反应肯定传走的时候把参数编码,后台在解码,
既是 javascript 与 java 两种语言 之间 编码解码 大pk了 ,
先介绍 java 的 解码编码
java中的URLEncoder和URLDecoder类
java 是按照以下进行方式编码的 (注意不会被编码的 不包括‘=’)
/*
1.字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不会被编码;
2.将空格转换为加号 (+) ;
3.将非文本内容转换成"%xy"的形式,xy是两位16进制的数值;
4.在每个 name=value 对之间放置 & 符号。
*/

(下面是不会被编码的)
1.大写字母A-Z
2.小写字母a-z
3.数字 0-9
4.标点符 - _ . ! ~ * ' (和 ,)

诸如字符: / & ? @ # ; $ + = 和 %也可以被使用,但是它们各有其特殊的用途,如果一个文件名包括了这些字符( / & ? @ # ; $ + = %),这些字符和所有其他字符就应该被编码。


一、URLEncoder(编码类)

在java1.3和早期版本中,类java.net.URLEncoder包括一个简单的静态方法encode( ), 它对string以如下规则进行编码:
public static String encode(String s)

这个方法总是用它所在平台的默认编码形式,所以在不同系统上,它就会产生不同的结果。结果java1.4中,这个方法被另一种方法取代了。该方法要求你自己指定编码形式:

public static String encode(String s, String encoding) throws UnsupportedEncodingException


对于一个字符 String name="name=天地& pwd=/hello";
编码后 name%3D%CC%EC%B5%D8%26+pwd%3D%2Fhello


特别需要注意的是这个方法编码了符号,“/” ,&,=,和:。它不会尝试着去规定在一个URL中这些字符怎样被使用。由此,所以你不得不分块编码你的URL,而不是把整个URL一次传给这个方法。这是很重要的,因为对类URLEncoder最通常的用法就是查询string,为了和服务器端使用GET方法的程序进行交互。例如,假设你想编码这个查询sting,它用来搜索AltaVista网站:
pg=q&kl=XX&stype=stext&q=+"Java+I/O"&search.x=38&search.y=3

这段代码对其进行编码:
String query = URLEncoder.encode( "pg=q&kl=XX&stype=stext&q=+/"Java+I/O/"&search.x=38&search.y=3");System.out.println(query);

不幸的是,得到的输出是:
pg%3Dq%26kl%3DXX%26stype%3Dstext%26q%3D%2B%22Java%2BI%2FO%22%26search.x%3D38%26search.y%3D3

出现这个问题就是方法URLEncoder.encode( ) 在进行盲目地编码。它不能区分在URL或者查询string中被用到的特殊字符(象前面string中的“=”,和“&”)和确实需要被编码的字符。由此,所以URL需要像下面这样一次只编码一块:


这才是你真正想得到的输出:
pg=q&kl=XX&stype=stext&q=%2B%22Java+I%2FO%22&search.x=38&search.y=3

同理 在 javascript 中 我们也应该对要传输的中文参数先编码 ,再写到要传输的字符串中

而javascript 编码函数是


encodeURIComponent();
java 对天地 两个字的编码是 %3D%CC%EC%B5%D8;
用javascript 函数编码 后是 %EF%BF%BD%EF%BF%BD%EF%BF%BD

但是用[color=red]get[/color]传值时

浏览器认为%是个转义字符,经过一次编码解码之后再传递给处理页面,这样的话服务器端就得不到正确结果了。所以 我们编码两次 来防止这种情况,(如果是post 解码,编码 就都不用了 )我们可以看到 %被编码成%25了

两次编码后 %25EF%25BF%25BD%25EF%25BF%25BD%25EF%25BF%25BD
我们可以看到 依旧 跟 java 对这个字编码后 的 编码不一样 但是
在后台 却是通过 java 的 Decoder.decode()拿到了想要的汉字 ;(不解中)
[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值