`
- 浏览:
73094 次
- 性别:
- 来自:
北京
-
既然是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()拿到了想要的汉字 ;(不解中)
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
在ajax中使用post方法,用常规的参数格式:param1=a1¶m2=a2 ,当参数长度过长时,依然提交不成功。比如我们经常这样写一个ajax的post请求: $.ajax({ type: "post", // post or get contentType:"application...
使用get遇到的问题: 1.问题一. 缓存:当每次访问的url相同,客户端直接读取本地缓存里面的内容,即使后台数据变化前台也不会有变化; 解决方法:在?后面链接一个num=【随机数Math.random()】或者num=【时间戳new ...
主要介绍了ajax中data传参的两种方式,结合实例形式简单分析了ajax参数传递的POST与GET方式,非常简单实用,需要的朋友可以参考下
如果想做到数据的交互,那么www.aa.com和book.aa.com必须由你来开发才可以。可以将book.aa.com用iframe添加到 www.aa.com的某个页面下,在www.aa.com和...就和平时同一个域中镶嵌iframe一样,直接调用里面的JS就可以了
Ajax对象接受一个对象字面量为参数,这个对象字面量中包含method,url,success,params,fail参数
get和post方法最大的不同在于: 1.get方法传值参数在url里面,而post参数放send里面 2.post方法必须加上 xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 下面实例可以看...
get和post方法最大的不同在于: 1.get方法传值参数在url里面,而post参数放send里面 2.post方法必须加上 xmlHttp.setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”); 下面实例可以看get...
关于原生Ajax知识:包含原生ajax的get/post传参方式、返回数据等
好,下面上货。 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核心代码,比较灵活,传参可以用POST和GET,可以返回TEXT和XML,实现同步或异步返回 调用访法 send_request('postback.asp',"POST","name=...
如果是传到新页面的话,你网站基于什么语言开发直接用get或者post获取,然后输出到这个层 通过url传参 如果是HTML页面的话JS传到新页面就[removed].href=’a.html?id=100′;然后a.html页面的JS就”s”> [removed] ...
var Store = Ext.create(‘Ext.data.Store’, { pageSize: pageSize, model: ‘Ext.data.Model名称’, autoLoad: false, proxy: { type: ‘ajax’, url: ‘请求路径’, getMethod: function(){ return ‘POST’;...
因为一开始是 GET 请求,所以当传递的数据过大的时候,会报错 nginx 414 request-uri too long 客户端请求头缓冲区大小,如果请求头总长度大于小于128k,则使用此缓冲区 client_header_buffer_size 128k; 请求头...
主要介绍了详解tomcat 解决 POST请求传参数过长受限制的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
目录 C#进阶系列——WebApi 路由机制剖析:你准备好了吗? ................................................................................................... 3 一、MVC和WebApi路由机制比较 ..................