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模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...
随机推荐
- PHP队列的实现
队列是一种特殊的线性表,它只允许在表的前端,可以称之为front,进行删除操作:而在表的后端,可以称之为rear进行插入操作.队列和堆栈一样,是一种操作受限制的线性表,和堆栈不同之处在于:队列是遵循“ ...
- 超简单开发自己的php框架一点都不难
(转)https://blog.csdn.net/qq_33862644/article/details/79344331 写框架的极简思路: 接收,打印参数想怎么弄.如 获取配置文件的方法,根据传过 ...
- 数据分析处理库Pandas——对象操作
Series结构 索引 修改 旧数据赋值给新数据,旧数据不变. 对某一数值进行修改,可以选择保留修改前或修改后的数值. 替换索引 修改某一个索引 添加 在数据1后添加数据2,数据1不改变. 添加一个数 ...
- 创建控制器view的几种方式
1. 根据storyboard的描述创建 2. 通过xib的描述创建 3. 通过代码创建控制器的view self.window = [[UIWindow alloc] initWithFrame:[ ...
- openwrt(二) 配置openwrt及编译
导航 1. 配置openwrt 2. 编译openwrt 3. 错误记录 1. 配置openwrt 在openwrt的根目录下,执行make menuconfig. 这个界面我也只是了解了这两个选项而 ...
- TouTiao开源项目 分析笔记20 问答详情
1.效果预览 1.1.效果预览,从问答列表开始 前面实现了从列表到内容. 这里主要讲解从内容到详情. 点击每一个回答内容,进入回答详情页面. 1.2.触发的点击事件 在WendaContentView ...
- TouTiao开源项目 分析笔记9 实现一个问答主页面
1.根据API返回创建几个基础的Bean 1.1.WendaArticleDataBean类 API返回的数据如下: /** * cell_type : 36 * extra : {"wen ...
- 10,python开发之virtualenv与virtualenvwrapper
在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程 ...
- jQuery的Ajax初识
1. 什么是Ajax? Ajax是“Asynchronous Javascript And XML(异步Javascript和XML)”的缩写, 是指一种创建交互式网页应用的网站开发技术. Ajax不 ...
- 什么是 IRC?
IRC是Internet Relay Chat 的英文缩写,中文一般称为互联网中继聊天.它是由芬兰人Jarkko Oikarinen于1988年首创的一种网络聊天协议.经过十年的发展,目前世界上有超过 ...