url为什么要编码及php中的中文字符urlencode基本原理
首先了解以下中文字符在使用urlencode的时候运用的基本原理:
urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%。
此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。
在做通过关键词查询条目的需求时,发现前端IOS传过来的“中文关键字”是通过url编码的字串,直接使用,我们是是用不了的,拿php为例,我们需要对该值使用urldecode()函数进行解码,解码后就会是对应的中文了。当时觉得很纳闷,为什么前端要对参数编码后传给后台,心里的答案时为了安全起见,防止别人截取url后对其中的参数进行解析。但是,总感觉好模棱两可,既然我后台可以解码出正确值,为什么截取了你url的人不可以呢,如此哪来的安全可言。
于是,我就问了问之前工作的ios的同事,结果,他斩钉截铁的告诉我,就是为了安全,我差点就以为就真的是这样了,不过还好我内心的强烈不同意与好奇心,在网上查了又查,于是,下面就是我得出的结论:
以iOS编程为例,每当我们从服务器获得到一个链接需要分析链接的组成,或者在捕捉本地网路请求作出响应判断的时候,我们经常需要对URL进行解码和编码。那么为什么要进行解码和编码呢。
比如有一个需求,你需要截取webveiw请求来实现一些操作。那么此时我们就需要从请求到的url中获取一些参数。
url:www.baidu.com?canshu1=zhi1&canshu2=zhi2
我们从url中获取参数值的方法是从=后获取值,针对这个链接,我们从链接中获取参数。有两种情况
1.参数有两个canshi1,canshu2,值分别是zhi1和zhi2
2.参数只有一个canshu1, 值为zhi1&canshu2=zhi2
显然造成了歧义。
为了避免歧义,我们需要就必须要讲值中的“=”或者“&”等特殊符号用其他符号代替,防止对=后面取值的方式造成影响,这个代替过程就是编码。
以情况2为例子,此处有一个参数canshu1,其值是“zhi1&canshu2=zhi2”,进行URL的utf8编码后得到zhi1%26canshu2%3Dzhi2,将编码后的值放入链接
www.baidu.com?canshu1=zhi1%26canshu2%3Dzhi2
于是拿到编码后链接的人解析,就直接取=后面的值作为canshu1的值,得到值为zhi1%26canshu2%3Dzhi2,然后对“zhi1%26canshu2%3Dzhi2”进行解码(需要用和编码同样的方式,一般有UTF8和gb2312)得到值“zhi1&canshu2=zhi2”,完全正确。
注意:如果值中有%26则也会被转化成%2626也不会造成歧义。
转自:http://www.jianshu.com/p/5713d699a14b
1、为什么要编码
网络标准RFC 1738规定url中只能包含英文字母和阿拉伯数字,以及一些特殊字符:
"...Only alphanumerics [0-9a-zA-Z], the special characters "$-_.+!*'()," [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL."
“只有字母和数字[0-9a-zA-Z]、和特殊符号”$-_.+!*’(),”[不包括双引号]、及某些保留字,才可以不经过编码直接用于URL。”
此时如果url中包含如汉字或者其他特殊字符则需要对它进行编码,编码的意义在于,假如url的参数中的中文或特殊字符在发送到服务端时,服务端无法解析它的真正意义,会导致服务端不能理解客户端的请求。
如:
url中的保留字?表示后面连接的是一些请求参数,而参数中如果也包含?,服务端就不知道从哪个?之后是参数;
url中的保留字&用来连接并列的参数项,参数中包含&时,服务端依然无法判断。
2、转码范围
ASCII 的控制字符
这些字符都是不可打印的,自然需要进行转化。
一些非ASCII字符
这些字符自然是非法的字符范围。转化也是理所当然的了。
一些保留字符
很明显最常见的就是“&”了,这个如果出现在url中了,那你认为是url中的一个字符呢,还是特殊的参数分割用的呢?
就是一些不安全的字符了。
例如:空格。为了防止引起歧义,需要被转化为“+”。
转自:http://blog.csdn.net/andanlan/article/details/53368727
url为什么要编码及php中的中文字符urlencode基本原理的更多相关文章
- 使用Java判断字符串中的中文字符数量
Java判断一个字符串str中中文的个数,经过总结,有以下几种方法(全部经过验证),可根据其原理判断在何种情况下使用哪个方法: 1. char[] c = str.toCharArray(); for ...
- java面试题:如果一串字符如"aaaabbc中国1512"要分别统计英文字符的数量,中文字符的数量,和数字字符的数量,假设字符中没有中文字符、英文字符、数字字符之外的其他特殊字符。
package com.swift; public class TotalNumber_String { public static void main(String[] args) { /* * 如 ...
- Tomcat 中get请求中含有中文字符时乱码的处理
Tomcat 中get请求中含有中文字符时乱码的处理
- WP8_UTF8 to GB2312转码 (url网址中带中文字符的处理)
直接使用例如:http://www.abc.php?name=中文符 ,客户端调用,在服务端修改后,会出现乱码, 而windows phone 又不能直接支持gb2312, 经过大量分析和验证,发现 ...
- [转载]Unicode中对中文字符的编码
以前写过一篇贴子是写中文在unicode中的编码范围 unicode中文范围,但写的不是很详细,今天再次研究了下unicode,并给出详细的unicode取值范围. 本次研究的unicode对象是un ...
- java中Cookie中文字符乱码问题
如果Cookie中的Value 中有中文字符出现,在加入Cookie的时候,会出现下面的错误: java.lang.IllegalArgumentException: Control characte ...
- 处理python字符串中的中文字符
# -*- coding:utf-8 -*- import sys,os txta = open('a.txt','r') str = '' for line in txta: str += line ...
- Python: 在CSV文件中写入中文字符
0.2 2016.09.26 11:28* 字数 216 阅读 8053评论 2喜欢 5 最近一段时间的学习中发现,Python基本和中文字符杠上了.如果能把各种编码问题解决了,基本上也算对Pytho ...
- 解决osg路径与文件名中的中文字符问题
转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...
随机推荐
- SQl 语句(常见) 新建,删除,修改表结构
2006-6-15 15:58:25 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) ...
- python 学习心得
多用类或是函数 我以前写的时候,不用函数,从头写到尾,后来,要改成函数,也是要花很多测试的时间,改的话还得一个调试,如果一开始就用函数的话,就能节省很多时间. 函数的功能尽可能的小 比如说像我用try ...
- python Re库的介绍
re库的贪婪匹配和最小匹配 后面跟着?变为最小匹配
- PHP.20-图片上传下载
图片上传下载 思路: 1.创建图片上传的存放目录 /uploads/ 2.index.php //浏览页面,提供上传表单 上传表单:文件上传必须使用enctype="multipart/fo ...
- css媒体类型
all 用于所有的媒体设备. aural 用于语音和音频合成器. braille 用于盲人用点字法触觉回馈设备. embossed 用于分页的盲人用点字法打印机. handheld 用于小的手持的设备 ...
- 10 class封装 ORM
1.版本1:初始化 # -*- coding:utf-8 -*- from MySQLdb import * class MysqlHelper: def __init__(self,host,por ...
- P2580 于是他错误的点名开始了(trie)
P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...
- RandomAecessFile open failed: EISDIR (Is a directory)
今天下午搞断点续传,下载文件的时候,弄了一下,我把下载的文件命名为plug.jar.后来老是报错: open failed: EISDIR (Is a directory) 我烦了,两个小时啊,我操. ...
- ionic3中关于Ionic ui component使用的一些总结
在我的理解中,IONIC中例如 ion-list ion-item ion-input 其实就是相于一段自定义的指令 ,相对于angular1.x中的东西, 所以,我们在使用中,要特别去注意butt ...
- Qsys配置生成nios系统模块
1. 本次使用的是别人写好的例程,主要研究学习,使用quartus 11打开工程 2. bdf文件是块编辑器的,相当于原理图,以前只在用NIOS的时候会用到这种方式.接下来新建一个工程,添加原理图元件 ...