一、 encodeURI来解决URL传递时的中文问题

1.前端:

   var url = baseContext+"xxxx.action?parm="+encodeURI(encodeURI('中'));

2.后端:

String supName = request.getParameter("parm");
supName = URLDecoder.decode(supName, "UTF-8");

二、特殊字符在传输过程中被转义编码( %+ASCII(16进制)码值 )

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。

如果不使用转义字符,这些编码就会当URL中定义的特殊字符处理

开发时有时服务端返回的json中包含url,url中可能含有一些特殊字符,这些特殊字符在传输的过程中可能会被转义成编码。这时候我们拿到手里要如何转换回去呢,先看下那些字符可能会被编码

三、

做页面开发的时候有时候,会使用Javascript的escape(),encodeURIComponent(),encodeURI ()这三个函数进行URL编码,防止特殊字符接收不到。

1.使用encodeURLComponent传递参数

    function URLencode(sStr) {sStr = escape(escape(sStr));location.href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+);}

2. 进行URL跳转的时候整体使用encodeURL

    function URLencode(sStr) {Location.href=encodeURI("http://cang.baidu.com/do/s?word=京东&ct=21"); }

3.js使用数据时可以用escape(个人用的比较多)编码功能比较强大

Javascript中的escape()是将中文按ISO-8859-1字符集进行URL编码的,那样通过 request.getParameter()是能直接获取到请求参数的,但后来的Javascript将escape()换成了Unicode字符集编 码,如此一来,在JSP和Servlet中就没法直接拿到请求参数了,而且此时的request获得的参数值都是空值,

四、

总结:URL编码转换函数:

escape() 不常用

encodeURI() 对整体URL编码 常用 不编码! @ # $ & ( ) = : / ; ? + 等符号

encodeURIComponent() 这种串不建议使用此编码http://www.oschina.net/search?scope=bbs

  1. escape() : 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都会转化成%xx格式的字符编码(xx代表此字符在字符集表里编码的16进制数字)。比如,空格符的对应编码是%20。不会对ASCII字符和数字进行编码。不会被此方法编码的字符:@ * / +,反向编码函数:unescape()

2. encodeURI(): 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $ & ( ) = : / ; ? + ',反向编码函数:decodeURI()

var str1 = encodeURI('http://www.oschina.net/search?scope=bbs&q=C语言')
str1
//"http://www.oschina.net/search?scope=bbs&q=C%E8%AF%AD%E8%A8%80"
decodeURI(str1)
//"http://www.oschina.net/search?scope=bbs&q=C语言"

3. encodeURIComponent():把URI字符串采用URF-8编码格式转化成escape格式的字符串。与encodeURI相比,这个函数会将更多的字符进行编码,比如"/"等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个来进行编码。否则“/”字符被编码后将URL显示错误。不会被此方法编码的字符:! * ( ),反向编码函数:decodeURIComponent()

encodeURIComponent('1@2')
"1%402"
decodeURIComponent("1%402")
"1@2"

.

TIPS: 浏览器不会自动转码

  1. PC浏览器,不会动URL中的参数、 cookie、 以及项目中显示的字符串,进行任何的自动转码。
  2. 有可能 我们的项目是UTF-8的,但是用户的浏览器编码设置 是其他的编码方式。可能会自动转码,待测试。

3. 多次编码,多次转码 涉及到用户名时

decodeURIComponent(decodeURIComponent(decodeURIComponent('jinyifan%252020321')))
"jinyifan 20321"
decodeURIComponent(decodeURIComponent('jinyifan%252020321'))
"jinyifan 20321"
decodeURIComponent('jinyifan%252020321')
"jinyifan%2020321"

解码多次一个不带%25(这是 %号的编码)的串时,多次解码结果是一样的。

decodeURIComponent('jinyifan%20321')
"jinyifan 321"
decodeURIComponent(decodeURIComponent('jinyifan%20321'))
"jinyifan 321"
decodeURIComponent(decodeURIComponent(decodeURIComponent('jinyifan%20321')))
"jinyifan 321"

编码多次一个带空格的串 是会产生大量的%25的

encodeURIComponent('jinyifan 321')
"jinyifan%20321"
encodeURIComponent(encodeURIComponent('jinyifan 321') )
"jinyifan%2520321"
encodeURIComponent(encodeURIComponent(encodeURIComponent('jinyifan 321') ))
"jinyifan%252520321"
encodeURIComponent(encodeURIComponent(encodeURIComponent(encodeURIComponent('jinyifan 321') )))
"jinyifan%25252520321"

前端给后端传用户名串时,编码几次合理?

注意:

  1. 鉴于以上存在的问题,在服务端解码过程中,需要谨慎考虑各种场景下(包括前端、领域)的编解码方式、次数(夹杂BASE64编码)等因素进行解码
var  id="aVUAAAACS+uJkta7";encodeURIComponent(id)
"aVUAAAACS%2BuJkta7"encodeURIComponent(encodeURIComponent(id));
"aVUAAAACS%252BuJkta7"

在前端与后端传递数据时,会遇到这样一个问题,如果传递的字符串中含有特殊字符

如:+ 空格/ ? % & = #

如果不进行特殊处理,会发生数据丢失的现象。

例如:我在前端传入后端"aVUAAAACS+uJkta7" 但是后端接收的时候接收到的是

"aVUAAAACS uJkta7" ,特殊字符“+”丢失了。

解决的办法就是:

前端在传递之前,检查一下是否有特殊字符,如果有,进行一下转换编码操作。

例如:前端部分

var  id="aVUAAAACS+uJkta7";
id = encodeURIComponent(encodeURIComponent(id));

后端在接收字符串时,检查是否有编码的形式,如果有,进行解码。这样就完成了特殊字符的传递。

后端部分:

String id = pd.getString("id");//获取id
id = java.net.URLDecoder.decode(id,"UTF-8");//特殊字符解码

这样id就成功完整地由前端传入后端了。

——————————————————————————————————————

decodeURI与decodeURIComponent区别

1. 概念:

URI: Uniform ResourceIdentifiers,通用资源标识符

Global对象的encodeURI()和encodeURIComponent()方法可以对URI进行编码,以便发送给浏览器。有效的URI中不能包含某些字符,例如空格。而这URI编码方法就可以对URI进行编码,它们用特殊的UTF-8编码替换所有无效的字 符,从而让浏览器能够接受和理解。

其中encodeURI()主要用于整个URI(例如,http://www.jxbh.cn/illegal value.htm),而encode-URIComponent()主要用于对URI中的某一段(例如前面URI中的illegal value.htm)进行编码。它们的主要区别在于,encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号、正斜杠、问号和井字号;而encodeURIComponent()则会对它发现的任何非标准字符进行编码。来看下面的例子:
var uri="http://www.jxbh.cn/illegal value.htm#start";
//”http: //http://www.jxbh.cn/illegal%20value .htm#s tart”
alert(encodeURI (uri)):
//”http% 3A%2F%2Fwww.jxbh.cn%2 Fillegal%2 0value. htm%23 start”
alert( encodaURIComponent (uri));

使用encodeURI()编码后的结果是除了空格之外的其他字符都原封不动,只有空格被替换成了%20。而encodeURIComponent()方法则会使用对应的编码替换所有非字母数字字符。这也正是可以对整个URI使用encodeURI(),而只能对附加在现有URI后面的字符串使用encodeURIComponent()的原因所在。一般来说,我们使用encodeURIComponent()方法的时候要比使用encodeURI()更多,因为在实践中更常见的是对查询字符串参数而不是对基础URL进行编码.

经我的观测,很多网站的cookie在进行编码的时候,是encodeURIComponent格式的,所以应该使用decodeURIComponent()进行解码

获取相册所有uri_URI转码相关推荐

  1. CIDetector 相册识别二维码出错

    在做点击相册识别二维码识别不了,折腾了大半天,终于从坑里爬出来 ,下面分享一下填坑过程 在创建相册和获取图片的时候添加上面的代码.然后用取出来的图片作为参数进行二维码识别,下面封装了一个类方法: pu ...

  2. Zxing图片识别 从相册选二维码图片解析总结

    Zxing图片识别 从相册选取二维码图片进行解析总结 在Zxing扫描识别和图片识别的解析对象是相同的 本文分三个步骤: 1 获取相册的照片 2 解析二维码图片 3 返回结果 1) 获取相册照片 go ...

  3. Android二维码多码识别,相册选择二维码,自定义扫码界面

    现在很多App都有扫码识别二维码的场景,最新的扫码已经支持全屏扫码.从相册选取二维码识别,以下使用基于Zxing封装的一个库:https://github.com/maning0303/MNZXing ...

  4. 相册权限_苹果手机惊现漏洞?App在未获取相册权限的情况下成功读取照片

    近日,知乎上网友爆料发现苹果手机存在漏洞,一款名叫"时间规划局"的App可在未获取相册权限的情况下读取照片.专家猜测可能是App调用了苹果的私有库,绕过了系统的授权机制. 2月26 ...

  5. 【Groovy】MOP 元对象协议与元编程 ( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

    文章目录 一.Groovy 类内部和外部分别获取 metaClass 二.分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三.使用 HandleMetaClass 注入方法 一 ...

  6. Android获取相册中图片的路径 4.4版本前后的变化

    两个问题: 1. 通过调用系统Action,从图库中选择图片,并展示到界面上 2. API19前后获取相册图片路径 详见(仅客户端代码),请移步:本人GITHUB Intent intent = ne ...

  7. 获取android设备唯一编号_android 获取手机设备的唯一码(IMIE )

    获取手机设备的唯一码(IMIE ) public void fetch_status(){ TelephonyManager tm = (TelephonyManager) this .getSyst ...

  8. ALAssetsLibrary获取相册列表

    之前一篇博客,说了下通过ALAssetsLibrary获取全部图片的方法,这里再说说获取相册列表的方法. 代码如下: -(void)test { ALAssetsLibrary* theLibrary ...

  9. android获取设备的唯一编号,android如何获取设备的唯一设备码

    在某些项目中,需要记录用户的某些设置,或行为,并上传到服务器,如果无需用户登录注册,就可记录独立这些内容,就需要用到设备的某些独立的序列.(以下部分android需要API8以以上,android2. ...

最新文章

  1. Marshal.ReleaseComObject
  2. 中小型互联网企业安全建设漫谈。
  3. 代码实现【mini版】——给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?
  4. 循环链表解决约瑟夫问题(简化版)
  5. C# 设置当前程序调用的dll文件以及其他文件的寻址路径
  6. Tail Recursion尾递归
  7. AS3.0中的显示编程(末篇)-- 滤镜(下)
  8. python实现批量图片/文件重命名
  9. ARP欺骗报文是这个样子的
  10. Pytorch——DataLoader(批训练)
  11. [转]PostgreSQL源码结构
  12. cache 的设计与实现
  13. 【图像去噪】基于matlab BM3D算法图像去噪【含Matlab源码 1779期】
  14. (已成功)windows下,VS2012+Qt5.5.1的安装、路径配置、项目配置(其它版本可参考)
  15. java activiti 工作流引擎_Activiti工作流引擎简介详解
  16. Mac改变系统截图存储路径
  17. 【服务器数据恢复】StorNext文件系统数据恢复案例
  18. 提升网页加载速度 | google网站速度测试
  19. 魔兽服务器修改端口,求魔兽世界某服务器IP地址和端口
  20. java 矩阵求逆_详解用java描述矩阵求逆的算法

热门文章

  1. 小猪笔记本电脑装linux时需要以下命令
  2. 白炽灯可控硅调光程序
  3. 二维vector的声明和初始化
  4. 考研数学一历年真题小题(选择填空)整理
  5. python中如果要多次输入文本,关于文本游戏:文本游戏 – 如果语句基于输入文本 – Python...
  6. 如何选购晨检机器人_扫地机器人好不好用?如何选购?答案在这
  7. python程序语法元素分析_Python程序语法元素分析(2)
  8. r语言的MASS包干什么的_怎么记住r语言这么多包?
  9. matlab全景图像拼接_带你认识网络高清全景监控摄像机
  10. outlook邮箱显示一直启动中_Outlook 2016 无法正常启动,显示“正在处理” 然而处理了好几天也没有处理完...