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

既然是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

但是用get传值时

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

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

你可能感兴趣的:(ajax post或者get 传参时中文问题)