`
IT少年
  • 浏览: 73094 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()拿到了想要的汉字 ;(不解中)
分享到:
评论
1 楼 背着家走 2011-12-16  
开完会 我要好好的看一下这篇文章,先支持一下~!

相关推荐

    ajax快速解决参数过长无法提交成功的问题

    在ajax中使用post方法,用常规的参数格式:param1=a1&param2=a2 ,当参数长度过长时,依然提交不成功。比如我们经常这样写一个ajax的post请求: $.ajax({ type: "post", // post or get contentType:"application...

    有关Ajax中get和post的使用问题

    使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new ...

    ajax中data传参的两种方式分析

    主要介绍了ajax中data传参的两种方式,结合实例形式简单分析了ajax参数传递的POST与GET方式,非常简单实用,需要的朋友可以参考下

    Ajax跨域传输参数

    如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和...就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了

    Ajax 对象 包含post和get两种异步传输方式

    Ajax对象接受一个对象字面量为参数,这个对象字面量中包含method,url,success,params,fail参数

    JS与Ajax Get和Post在使用上的区别实例详解

    get和post方法最大的不同在于: 1.get方法传值参数在url里面,而post参数放send里面 2.post方法必须加上 xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 下面实例可以看...

    Js+Ajax,Get和Post在使用上的区别小结

    get和post方法最大的不同在于: 1.get方法传值参数在url里面,而post参数放send里面 2.post方法必须加上 xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 下面实例可以看get...

    (免费)菜狗学前端之原生Ajax笔记

    关于原生Ajax知识:包含原生ajax的get/post传参方式、返回数据等

    基于vue 添加axios组件,解决post传参数为null的问题

    好,下面上货。 1、安装axios npm install axios --save 2、添加axios组件 import axios from 'axios' axios.defaults.headers.post['Content-Type'] = '...3、get请求 testGet: function () { this.$ajax({

    ajax 核心代码

    附件中的代码是经过本人大量实验,结合他人资料总结出来一段ajax核心代码,比较灵活,传参可以用POST和GET,可以返回TEXT和XML,实现同步或异步返回 调用访法 send_request('postback.asp',"POST","name=...

    用js通过url传参把数据从一个页面传到另一个页面

    如果是传到新页面的话,你网站基于什么语言开发直接用get或者post获取,然后输出到这个层 通过url传参 如果是HTML页面的话JS传到新页面就[removed].href=’a.html?id=100′;然后a.html页面的JS就”s”> [removed] ...

    Extjs4.0设置Ext.data.Store传参的请求方式(默认为GET)

    var Store = Ext.create(‘Ext.data.Store’, { pageSize: pageSize, model: ‘Ext.data.Model名称’, autoLoad: false, proxy: { type: ‘ajax’, url: ‘请求路径’, getMethod: function(){ return ‘POST’;...

    在Js页面通过POST传递参数跳转到新页面详解

    因为一开始是 GET 请求,所以当传递的数据过大的时候,会报错 nginx 414 request-uri too long 客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区 client_header_buffer_size 128k; 请求头...

    详解tomcat 解决 POST请求传参数过长受限制的问题

    主要介绍了详解tomcat 解决 POST请求传参数过长受限制的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    C#进阶系列--WebApi

    目录 C#进阶系列——WebApi 路由机制剖析:你准备好了吗? ................................................................................................... 3 一、MVC和WebApi路由机制比较 ..................

Global site tag (gtag.js) - Google Analytics