混乱的url编码||URL编码解码问题_weixin_34007020的博客-程序员秘密

技术标签: ViewUI  操作系统  javascript  

转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

一。问题的由来。 url就是网址,只要上网就一定会用到。 一般来说,URL只能使用英文字母,阿拉伯数字和某些标点符号,不能使用其他文字和符号。 比如,世界上有英文字母的网址,http:
//www.xyz.com' 但是没有希腊文的网址http://aerfa,beita,segma.com。这是因为网络 标准RFC 1738做了硬性规定: 只有字母和数字[0-9a-zA-Z], 一些特殊符号$-_.+!*'(),以及某些保留字,才可以不经过编码直接用于URL 这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是RFC_1738没有规定具体的编码方法,而是交给应用程序‘浏览器’自己决定。 这导致url编码成为一个混乱的区域。 下面就让我们看看,“URL”编码到底有多混乱。我会依次分析四种不同的情况,在每一种情况中,浏览器的编码方法都不一样。 把他们的差异解释清楚之后,我再说如何用javascript找到一个统一的编码方法。 1, http://zh.wikipedia.org/wiki/春节 结论1;网址路劲的编码,用的是utf8编码 2,http://www.baidu.com/s?wd=春节 结论2:查询字符串的编码,用的是操作系统的默认编码。 3,在浏览器直接输入春节 baidu google 结论3:get和post方法的编码,用的是网页的编码 4,ajax调用的url包含汉字 ex: url=url+"?q=" + document.form.getelements[0].value. //假设表达提交的为春节。 http_request.open('GET', url, true); 结论4:在ajax调用中,ie总是采用GB2312编码(即操作系统默认编码), 而firefox总是采用utf-8编码。

=========================================================================================
linux
origin: http://www.baidu.com/s?wd=魔兽
normalize: www.baidu.com/s?wd=魔兽
re-url_encoded: www.baidu.com/s?wd=%E9%AD%94%E5%85%BD
firefox:
        https://www.baidu.com/s?wd=%E9%AD%94%E5%85%BD



windows下的编码:

linux(默认utf8)
wd=%E9%AD%94%E5%85%BD  


 

void test_encoding(std::string& url) {
    std::cout << "origin: " << url << std::endl;
    char url_normal[1024];
    int z = normalize(url.c_str(), url_normal, sizeof(url_normal));  //将url中非保留字及允许的ascii码
    if(z==1){
        std::cout << "normalize: " << url_normal << std::endl;
        char* p = slu::reencode_escapes(url_normal);
        std::cout << "re-url_encoded: " << p << std::endl;
        delete[] p;
    }else{
        std::cout << "valid url : " << url << std::endl;
    }
} 

origin: http://zhidao.baidu.com/search?word=%C8%E7%BA%CE%C9%BE%B3%FD%B0%D9%B6%C8%D6%AA%B5%C0%D7%A8%D2%B5qq1036363060&ie=gbk&site=-1&sites=0&date=0&pn=90
normalize: zhidao.baidu.com/search?word=ɾҵqq1036363060&ie=gbk&site=-1&sites=0&date=0&pn=90
re-url_encoded: zhidao.baidu.com/search?word=%C8%E7%BA%CE%C9%BE%B3%FD%B0%D9%B6%C8%D6%AA%B5%C0%D7%A8%D2%B5qq1036363060&ie=gbk&site=-1&sites=0&date=0&pn=90

图中:为乱码


结论:
escape类函数,其实仅仅是把url非保留字符全部(添加%转义)了, 实际的二进制并没有变。



 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34007020/article/details/85730376

智能推荐

pku_oj: W11-02熄灯问题(C++)_banshan4622的博客-程序员秘密

问题描述:有一个由按钮组成的矩阵, 其中每行有6个按钮, 共5行,每个按钮的位置上有一盏灯当按下一个按钮后, 该按钮以及周围位置(上边, 下边, 左 边, 右边)的灯都会改变一次如果灯原来是点亮的, 就会被熄灭如果灯原来是熄灭的, 则会被点亮输入:输入一个案例,案例由5行组成, 每一行包括6个数字,这些数字以空格隔开, 可以是0或1。0 表示灯的初始状态是熄灭...

python简介_weixin_34018202的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

SVO学习日记-8--2021.2.1_tukey权重函数_梅干菜烧饼的博客-程序员秘密

SVO-8-pose_optimizer–2021.2.1pose_optimizer.h#ifndef SVO_POSE_OPTIMIZER_H_#define SVO_POSE_OPTIMIZER_H_#include &lt;svo/global.h&gt;namespace svo{ using namespace Eigen; using namespace Sophus; using namespace std; typedef Matrix&lt;doubl

tgt服务端流程分析_weixin_34232744的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

SDK编程笔记 — 计时器篇_vivado sdk计时_n5的博客-程序员秘密

SDK编程笔记 — 计时器篇两个计时器API的讨论  SetTimer函数用于创建一个计时器,KillTimer函数用于销毁一个计时器。计时器属于系统资源,使用完应及时销毁。  SetTimer的函数原型如下:UINT_PTR SetTimer( HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFun

编译caffe时遇到CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin .build_release/li_落落雨的博客-程序员秘密

我电脑上本来是有编译好的caffe的,但是由于要跑的代码里作者自带了caffe,为了防止后续跑代码时不必要的麻烦,索性就重新按照作者的方法编译了一下caffe(不过是在另一个分支上进行的,并不影响我原来的caffe)。于是乎就遇到了问题:CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin.buil

随便推点

VUE iview vue-router 跳转打开新的窗口并传递参数_wjm0519的博客-程序员秘密

第一种方法1.在跳转代码上加上 tag="a" target="_blank"2.亲测有效第二种方法1.通过resolve方法来实现2.按照上面书写格式,路由会跳转到更目录打印结果如下,结果并不是我们想要的3.将resolve下的name参数改成path完美解决...

27-黑马程序员------OC 语言学习笔记--- Foundation02_weixin_33979203的博客-程序员秘密

黑马程序员------&lt;a href="http://www.itheima.com" target="blank"&gt;Java培训、Android培训、iOS培训、.Net培训&lt;/a&gt;、期待与您交流! -------NSArray和NSMutableArrayNSArray代表元素有序,可重复的一个集合,集合中每个元素都有其对应的顺序索引,NSArray只能保存对象,不...

SpringBoot中解决在idea中静态资源路径问题_MoRan_Lei的博客-程序员秘密

在学习SpringBoot中遇见个小问题,在此我总结一下,如果大家遇到此类的小问题可以参考一下首先在SpringBoot中静态资源存放的位置是resources/static下,而Html存放的地方为templates如果要引入js或者css等静态资源考虑路径的问题,在application,yml中配置相应的配置在SpringBoot中,默认配置的/**映射到/static。

Python的包管理工具_我的微信公众号的博客-程序员秘密

python在发展过程中出现了很多种不同的包管理工具和包格式。画了个思维导图整理了一下基本信息。目前官方推荐使用pip和wheel格式。

ps切图教程 android,PS前端切图完整教程_阿廖林诺的博客-程序员秘密

部分看了文章的设计师,来找我说怎么切图。sorry?在我的理解,这就是切图啊,但是他们所指的“切图”是,怎么把设计图制作成html页面,下面我们通过详细案例讲解PS前端切图完整教程。在我看来,现在人们对于前端都是有误区的。认为前端是切图的,(也确实是这么叫的,本人情感上很不愿意听前端被叫做“切图的”)所以也会误认为我的这篇文章是写给设计师的。其实不然,这篇文章适用于计算机出身的前端甚至后端、对于P...

推荐文章

热门文章

相关标签