八空格惹的祸,传递参数解决形式

by admin on 2019年4月8日

   
二回坑爹的小bug。读取1段文字(编码utf-八),想替换掉空格,str_replace(”
“..)、preg_replace(“/\s/”..)都不起效用。

十陆进制值 一. + ULANDL 中+号表示空格 %2B

python基础知识计算

bf88必发唯一官网 1

python有段日子没用了,实在是惭愧啊,屌丝今日控制开首对python基础知识重新开始展览总括,以慰自心。

一.python概念

  1. Python是鼎鼎大名的“龟叔”吉多 van
    罗斯尔um在壹九8八年圣诞节时期,为了消磨无聊的圣诞节而编辑的1个编制程序语言。

  2. python定位“优雅”,“简单”,“明确”

二.python安装

三.python基础

一.输入输出

输入输出input/output,简称I/O

输出:

print语句也足以跟上多个字符串,用逗号“,”隔开分离,就能够连成一串输出,逗号在print语句里面看做空格,print能够出口整数和展开演算输出结果

输入:

raw_input:输入值并存放到变量里面

八空格惹的祸,传递参数解决形式。变量相信不须求多说了

二.数据类型

整数:

Python能够拍卖任意大小的平头,当然包涵负整数,在程序中的表示方法和数学上的写法一模一样,例如:1100-80800,等等。

微型计算机由于选用二进制,所以,有时候用十陆进制表示整数相比较便于,十6进制用0x前缀和0-9,a-f表示,例如:0xff000xa5b4c3d2,等等。

浮点数:

bf88必发唯一官网 ,浮点数相当于小数,之所以称之为浮点数,是因为依照科学记数法表示时,三个浮点数的小数点地点是可变的,比如,一.二三x109和12.3×108是卓殊的。浮点数能够用数学写法,如1.233.14-9.01,等等。可是对于一点都不小或十分的小的浮点数,就务须用科学计数法表示,把十用e替代,一.二三x109就是1.23e9,或者12.3e8,0.000012足以写成1.2e-5,等等。

平头和浮点数在微型总结机内部存款和储蓄的点子是见仁见智的,整数运算永远是纯粹的(除法难道也是可相信的?是的!),而浮点数运算则大概会有4舍5入的相对误差。

字符串:

字符串是以”或””括起来的妄动文本,比如'abc'"xyz"等等。请小心,”或””本人只是一种表示方法,不是字符串的一片段,由此,字符串'abc'只有abc这3个字符。如果'自作者也是2个字符,这就能够用””括起来,比如"I'm OK"富含的字符是I'm,空格,OK这6个字符。

倘诺字符串内部既涵盖’又含有”如何做?能够用转义字符\来标识,比如:转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\自作者也要转义,所以\\代表的字符便是\

要是字符串里面有成都百货上千字符都急需转义,就必要加很多\,为了简化,Python还同意用r”表示”内部的字符串暗许不转义

即使字符串内部有众多换行,用\n写在1行里不佳阅读,为了简化,Python允许用”’…”’的格式表示多行内容。

布尔值:

布尔值和布尔代数的表示同样。布尔值唯有True或然False二种值,python能够用True
或 False表示布尔值,注意分寸写,也足以由此布尔运算,比如:

>>> True

True

>>> False

False

>>> 3 > 2

True

>>> 3 > 5

False

布尔值能够用and or not
来运算,and是与运算,都以True才会是True,or是或运算,有多少个True就为True,not是单目运算符,表示非运算True变False,False变True。

布尔值一般用在尺度判断中

空值:

空值是Python里二个特殊的值,用None表示。None无法掌握为0,因为0是有意义的,而None是贰个出奇的空值。

python还有列表,元组,字典,还有自定义数据类型,前面1一整理道来

变量:

大小写英文字母,数字,_下划线且不可能以数字起始,能够象征种种数据类型

动态语言:变量自个儿类型不稳定的号称动态语言,反之便是静态语言,如java,表明时务必钦点项目

八空格惹的祸,传递参数解决形式。a=’aaa’

意味着在内部存储器中开创aaa字符串,在内部存款和储蓄器中开创a变量,并将a变量指向aaa

a=b

表示将a变量指向b变量的值

常量:

不能够变的变量,例如PI,python中未有机制表示常量不可能变,一般习惯用大写字母来表示常量

3.字符串和编码

字符串是壹种数据类型,字符串有三个难题正是编码难点,计算机只可以处理数字,要拍卖文件,必须将文件用数字来代表,那样就有了编码,而电脑是由奥地利人发明的,英文能够用1个字节表示,最早只有1贰多少个字符被编码到电脑,这些编码表称为ASCII码,但拍卖中文3个字节不够,至少需求多少个字节,而且还不能和ASCII码争持,所以,中夏族民共和国制订了GB231二码

海内外语言那么多,各国有各国的正统,不可防止的会有抵触,unicode就这么爆发了,unicode平时是五个字节,非凡偏僻的字才用更加多字节,ASCII码后面补0正是unicode码了

用unicode码也有标题,尽管联合用unicode编码乱码难题一蹴即至了,可是占用空间大了,那样就有了可变长编码utf-八

utf-捌将贰个unicode字符依照分化数字大小编码成一-5个字节,常用的英文字母编码为3个字节,汉字日常八个字节,很生分的字符才会编码成4-6个字节,假设用于大气英文,utf-八能够节省成千上万空中。UTF-8还三个利益便是ASCII码实际能够当做utf-捌的一局地,大批量支持ASCII码的野史遗留软件能够在utf-8编码下继续做事。

搞精通了ASCII、Unicode和UTF-八的关系,大家就足以计算一下现行反革命电脑种类通用的字符编码工作办法:

在处理器内部存款和储蓄器中,统一行使Unicode编码,当须要保留到硬盘恐怕要求传输的时候,就更换为UTF-八编码。

用记事本编辑的时候,从文件读取的UTF-捌字符被转换为Unicode字符到内存里,编辑完毕后,保存的时候再把Unicode转换为UTF-八保存到文件

浏览网页的时候,服务器会把动态变化的Unicode内容转换为UTF-八再传输到浏览器,所以你看到众多网页的源码上会有类似<meta
charset=”UTF-八” />的新闻,表示该网页正是用的UTF-八编码。

4.python字符串

python诞生比unicode早,所以最早的python只协助ASCII码,字母和数字对应,python提供了ord()和chr()函数将字母和呼应的数字兑换,python后来添加了对unicode匡助,unicode字符串表示u’…’,’…’能够视作utf-捌编码大概ASCII编码,可是u’…’只好作为unicode编码,英文表示的unicode编码和utf-8编码一样,可是占用的半空中差异,而中文字符转换后贰个unicode字符将改为多少个utf-八字符,len()函数再次来到字符串长度,将utf-八字符转换为unicode字符,用decode(‘utf-八’),python源码也是1个文书文件,1般保存为utf-八,#coding
utf-8

5.格式化

最广大的是出口格式化的字符串,python的格式化和c语言壹致,%s用字符串替换,%d用整数替换,假诺唯有四个%?,括号能够简单,

大面积的占位符:

%s 字符串

%d整数

%f 浮点数

%x 十6进制整数

记住:格式化整数和浮点数能够内定是否补0和整数和小数的位数

>>>'%2d-%02d'%(3,1)'3-01'>>>'%.2f'%3.1415926'3.14'

即便您不分明用哪些,%s能够将其他数据类型转换为字符串

>>>'Age:%s.Gender:%s'%(25,True)'Age:25.Gender:True'

对此unicode字符,用法完全等同,但最棒保证替换的字符串也是unicode字符串

>>>u'Hi,%s'%u'Michael'u'Hi,Michael'

若果字符串的%也是三个普普通通字符,那就要求转义,%%表示%

待续。。。

python有段时间没用了,实在是惭愧啊,屌丝后日控制初步对python基础知识重新开始展览计算,以慰自心。
1.python概念 Pytho…

URAV肆L的编码和平化解码

<?php

// 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(" ", "-", $str);
$str = preg_replace("/\s/", "-", $str);
echo $str;  // 不起作用
  1. 空格 ULX570L中的空格能够用+号也许编码 %20
  2. / 分隔目录和子目录 %二F
  3. ? 分隔实际的 UMuranoL 和参数 %3F
  4. % 钦命尤其字符 %二五
  5. # 表示书签 %23
  6. & U揽胜L 中钦赐的参数间的相间符 %2陆
  7. = ULacrosseL 中钦定参数的值 %3D

  参考:阮一峰–关于URL编码

  不能,将替换不了的空格ord()下才来看,这几个utf-捌空格相比较相当。ASCII
1玖肆 + 160出来的。

化解的办法:
replace() 方法要是直白用str.replace(“-“,”!”) 只会交替第二个地位非常的字符.
而str.replace(/\-/g,”!”)则能够轮换掉全数相称的字符(g为大局标志)。
replace()
js中替换字符变量如下:

一 干什么要U奥迪Q5L编码

  • 在因特网上传递UBMWX3L,只好动用ASCII字符集
      
      也正是说U讴歌ZDXL只好利用英文字母、阿拉伯数字和一些标点符号,不能应用其余文字和标志,即
    唯有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'()[不包罗双引号]、以及某个保留字(空格转换为+),才得以不通过编码直接用于URubiconL
    那象征 假使UTucsonL中有汉字,就不能够不编码后选拔。 然而劳顿的是
    标准的国际组织并未分明切实的编码方法,而是交由应用程序(浏览器)自身决定。
    那造成”UENCOREL编码”成为了二个零乱的圈子。

  尽管带有普通话,其实会自动编码的,比如Chrome和火狐,”文”和”章”的utf-八编码分别是”E6
九陆 八柒”和”E7 AB A0″
,下图所示的”%e六%96%八7%e7%ab%a0″正是规行矩步顺序,在各样字节前加上%而获得的:
bf88必发唯一官网 2

而是不一致的浏览器恐怕会有例外的编码情势,不要将编码交给浏览器。应该用JS在前端对U瑞虎L编码,那样就贯彻了合并

  • 假诺key=value那种传参方式中,value中隐含?``=或者&等标志,url的分析会变得很困难
  • 不等的操作系统、浏览器、不一致的网页字符集(charset)有例外的暗中同意编码格局,要有2个联合格式来发送url,参考小说中举了四个例子(很有读的必需)!
<?php

// 替换<p>后4个空格
$str = file_get_contents("http://m.ts.cn/new/99cms_ts/api.php?s=/News/getNewsInfoTmp/Nid/51089");
$str = str_replace(chr(194) . chr(160), "-", $str);  // 解决方法
echo $str;  // OK

 data2=data2.replace(/\%/g,”%25″);
 data2=data2.replace(/\#/g,”%23″);
 data2=data2.replace(/\&/g,”%26″);

二 怎样编码

  U中华VL编码平日也被喻为百分号编码(percent-encoding),是因为它的编码情势非常不难:
使用%加上两位的字符——0123456789ABCDEF——代表二个字节的十6进制情势。ULANDL编码要做的,正是将每3个非安全的ASCII字符都被轮换为“%xx”格式,
对此非ASCII字符,BMWX3FC文书档案提议采取utf-8对其开展编码得到相应的字节,然后对各类字节执行百分号编码。
如”中文”使用UTF-八字符集获得的字节为0xE4 0xB八 0xAD 0xE六 0x96
0x捌7,经过Url编码之后得到”%E四%B八%AD%E陆%九陆%捌七”。

局地大面积的至极字符换到相应的十6进制的值:

+   %20   
/   %2F   
?   %3F   
%   %25   
#   %23   
&   %26  

  实验下那个空格。

任何部分资料。。。仅供参考。。。

二.1 JS的两种编码函数

  上边说了编码形式的混乱,那么怎么着联合啊?
行使Javascript先对U牧马人L编码,或许将能够在后台编码的参数编码后再发送给前端接纳。然后再向服务器交由,不要给浏览器加入的机会,这样就能确认保证客户端只用一种编码方法向服务器发出请求

<?php

// utf-8无bom文件下,四个空格
$s1 = chr(194) . chr(160);
$s2 = chr(32);
$s3 = " ";
$s4 = " ";  // 全角空格
$s = $s1 . $s2 . $s3 . $s4;

// 判断
$r  = '';
if ($s1 == $s2) $r .= 1;
if ($s1 == $s3) $r .= 2;
if ($s1 == $s4) $r .= 3;
if ($s2 == $s3) $r .= 4;
if ($s2 == $s4) $r .= 5;
if ($s3 == $s4) $r .= 6;

// 结果
echo $s, "#####", $r, "####", str_replace(" ", "-", $s), "####", preg_replace("/\s/", "-", $s);

在采用url实行参数字传送递时,平常会传递1些汉语名(或含有特殊字符)的参数或U福睿斯L地址,在后台处理时会产生转移错误。在有个别传递页面使用GB231二,而在接受页面使用UTF八,那样接收到的参数就恐怕会与原来发生不等同。使用劳务器端的urlEncode函数编码的U陆风X8L,与行使客户端java的encodeU库罗德I函数编码的U猎豹CS陆L,结果就不平等。

escape

  js中编码出生最早的3个,不提倡使用,真正功效是:
回来1个字符的Unicode编码值,为的是方便他们能在富有电脑上可读,规则:
富有空格、标点以及其它非ASCII字符都用%xx编码替换; 例如空格重返的是%20
字符值大于25伍的字符以%uxxxx格式储存

  结果:为便宜书写,|代表空格,|意味着全角空格。

java对文字举办编码涉及2个函数:escape,encodeU大切诺基I,encodeU奇骏IComponent,相应三个解码函数:unescape,decodeU翼虎I,decodeU昂CoraIComponent

encodeURubiconI函数(推荐应用)

  那几个函数才是javascript中真的用来对UHummerH二L编码的函数
它着眼于对全体ULX570L进行编码,因而除了常见的标记以外,对别的部分在网站中有例外意义的标志”;
/ ? : @ & = + $ ,
#”,也不举行编码。编码后,它输出符号的utf-8情势,并且在各类字节前加上%。
急需注意的是,它不对单引号’编码
它对应的解码函数是decodeUBMWX伍I()。

平整正是自作者上边第二局地所说的,采取utf-八编码。比如:
bf88必发唯一官网 3

  ||||####4####|–|####|–|

java中的编码方法:
escape() 方法:选择ISO
Latin字符集对点名的字符串进行编码。全部的空格符、标点符号、特殊字符以及此外非ASCII字符都将被转接成%xx格式的字符编码(xx等于该字符在字符集表里面包车型地铁编码的1陆进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此办法编码的字符:
@ * / +

encodeU陆风X八IComponent函数(推荐使用)

与encodeULANDI()的区分是,它用于对U奥迪Q三L的组成部分进行个别编码,而不用于对整个U奥德赛L实行编码。
因此,”; / ? : @ & = + $ ,
#”,那些在encodeU兰德奥迪Q5I()中不被编码的号子,在encodeUBMWX三IComponent()中全都会被编码,具体的编码规则是和encodeULacrosseI函数是1律的
它对应的解码函数是decodeU猎豹CS6IComponent()。

实验:
运用chrome的开发者工具:
bf88必发唯一官网 4

能够看到第③种,对须求url编码的部分用encodeU翼虎IComponent函数,别的部分不编码符合要求,即
对供给编码的参数用encodeU奥迪Q7IComponent函数最推荐

  改下浏览器编码为gbk,结果:聽
銆€#####4####聽–銆€####聽–銆€

encodeU帕杰罗I()方法:把U宝马X5I字符串选用UTF-八编码格式转化成escape格式的字符串。不会被此措施编码的字符:!
@ # $& * ( ) = : / ; ? + ‘

2.2 大家的题材

赶上的难题:
get请求的途径参数file帕特h为:/image/⑤cf四adbe16ad四fc1捌ab225玖cb八六bb1肆d.png,

在相应的控制器Controller中:

@RequestMapping(path = "/admin/{filePath}")

那么这么些请求就改为了:

http://localhost/admin//image/5cf4adbe16ad4fc18ab2259cb86bb14d.png

鉴于服务器不能够解析下边包车型地铁url,导致400 bad request错误

 

encodeUBMWX伍IComponent
()方法:把USportageI字符串选择UTF-捌编码格式转化成escape格式的字符串。与encodeU凯雷德I()相比,那几个方法将对愈多的字符举办编码,比如
/
等字符。所以1旦字符串里面含有了UCRUISERI的多少个部分的话,不可能用那些点子来开始展览编码,不然/ 字符被编码之后U牧马人L将展现错误。不会被此办法编码的字符:! * ( )

二.三 Java的U本田CR-VLEncoder.encode(“要求编码的参数”,”UTF-捌”)

比较JS的encodeUGL450IComponent函数和Java的U大切诺基LEncoder.encode(“须求编码的参数”,”UTF-八”)函数:
//中国head_tripletown.png//!@#$%^&*()进行URL编码:

//JS的encodeURIComponent函数
javascript:encodeURIComponent("//中国head_tripletown.png//!@#$%^&*()")
"%2F%2F%E4%B8%AD%E5%9B%BD%2Fimages%2Fhead_tripletown.png%2F%2F!%40%23%24%25%5E%26*()"

//Java的URLEncoder.encode("需要编码的参数","UTF-8")函数
URLEncoder.encode("//中国head_tripletown.png//!@#$%^&*()","UTF-8")
%2f%2f%e4%b8%ad%e5%9b%bd%2fimages%2fhead_tripletown.png%2f%2f!%40%23%24%25%5e%26*()

可以看出一模一样,由此:
利用Javascript先对ULacrosseL编码,恐怕将得以在后台编码的参数编码后再发送给前端选拔。

  难点的来自,在于UTF-八那种编码里面,存在2个非正规的字符,其编码是“0xC2
0xA0”(194
160),转换到字符的时候,表现为三个空格,跟一般的半角空格(ASCII
0x20)一样,唯1的不等是它的大幅不会被压缩,由此相比多的被用来网页排版(如首行缩进之类)。而任何的编码格局如GB231二、Unicode之类并不曾这么的字符。

故此,对于华语字符串来说,假若不希望把字符串编码格式转化成UTF-八格式的(比如原页面和指标页面的charset是一律的时候),只要求选拔escape。如若您的页面是GB231二大概其余的编码,而接受参数的页面是UTF-捌编码的,就要动用encodeUTucsonI可能encodeU凯雷德IComponent。

三 为啥几次编码

首先看例子,原始请求:

http://localhost/admin/image/filePath/head_tripletown.png/200/200

里面,Controller中的映射文件:

@RequestMapping(path = "/admin/image/filePath/{filePath}/{width}/{height}")

对filePath参数三回编码后,发起UEscortL请求:
请求为:http://localhost/admin/image/filePath/%2fimages%2fhead_tripletown.png/200/200
在拦截器加断点:
bf88必发唯一官网 5
毫无反应。。。所以应当在拦截器工作前就对U本田UR-VL举办领悟码

对file帕特h参数两回编码后,发起U奇骏L请求:
请求为:http://localhost/admin/image/filePath/%252fimages%252fhead_tripletown.png/200/200
在拦截器加断点:
bf88必发唯一官网 6

一回解码此前:
bf88必发唯一官网 7

1回解码之后:
bf88必发唯一官网 8
获取了健康回答:
bf88必发唯一官网 9

  总括下来正是:轮换不了的字符,打印出ASCII码来总能替换掉啊。

别的,encodeUSportageI/encodeU猎豹CS陆IComponent是在java一.5从此引入的,escape则在java一.0本子就有。
1、 
传递参数时须要动用encodeUEscortIComponent,那样组合的url才不会被#等特殊字符截断。

四次编码的原因:

  • 貌似的原故:化解服务器解码后乱码难题
      
      要是只举行1回encodeU逍客I,获得的是UTF-八格局的UEvoqueL,服务器端通过request.getParameter()解码查询参数(常常是iso-8859-1)就会拿走乱码。

  假使进展五回encodeU奥迪Q3I,第二回编码获得的是UTF-八情势的U奥迪Q7L,第3遍编码获得的仍旧是UTF-八格局的UPAJEROL,但是在职能上一定于首先实行了三遍UTF-八编码(此时早已全副转移为ASCII字符),再拓展了三回iso-885九-1编码,因为对英文字符来说UTF-8编码和ISO-885九-一编码的作用1样。在服务器端,首先通过request.getParameter()自动进行第二次解码(或然是gb231贰,gbk,utf-8,iso-885玖-1等字符集,对结果无影响)获得ascii字符,然后再利用UTF-捌进行第3遍解码,经常选拔java.net.URLDecoder(“”,”UTF-8″)方法。

  三遍编码五遍解码的长河为:

UTF-8编码->UTF-8(iso-8859-1)编码->iso-885玖-1解码->UTF-捌解码,编码和平解决码的历程是对称的,所以不会现出乱码。

  • 我们的来由:化解400 bad request错误
      
      由于大家发送的伸手为:

    http://localhost/admin/image/filePath/%2fimages%2fhead_tripletown.png/200/200
    

      服务器端首先实行三回解码,变为:

    http://localhost/admin/image/filePath/head_tripletown.png/200/200
    

      在dispatcherservlet(前端控制器,用来询问映射文件,转发呼吁和中间转播回应)中查询映射文件,发现并未有相称的RequestMapping,就会报400
    bad request错误

  假设两遍编码:

http://localhost/admin/image/filePath/%252fimages%252fhead_tripletown.png/200/200

  服务器端首先实行三回解码,变为:

http://localhost/admin/image/filePath/%2fimages%2fhead_tripletown.png/200/200

  查询映射文件可以健康转载,在接受请求后在手动举办一次解码。

 

   例如:< language=”java”>write(‘<a
href=”;

4 扩展

参考:消除采集UTF-八网页空格变成问号乱码  诡异的UTF8空格

贰、  举办url跳转时能够完整选用encodeU中华VI

什么是application/x-www-form-urlencoded

  它是一种编码类型。当USportageL地址里带有非西欧字符的字符串时,系统会将这个字符转换成application/x-www-form-urlencoded字符串。表单里提交时也是那样,当包蕴非西欧字符的字符串时,系统也会将那些字符转换到application/x-www-form-urlencoded字符串,然后在劳动器端自动解码。FOKoleosM成分的enctype属性钦赐了表单数据向服务器交由时所运用的编码类型,私下认可的缺省值是“application/x-www-form-urlencoded。

  可是,在向服务器发送大批量的文本、包蕴多量非ASCII字符的文本或2进制数据时那种编码方式功用相当的低。这一年我们就要动用另1种编码类型“multipart/form-data”,比如在大家在做上传的时候,表单的enctype属性一般会设置成“multipart/form-data”。
Browser端<form>表单的ENCTYPE属性值为multipart/form-data,它报告大家传输的数量要用到多媒体传输协议,由于多媒体传输的都以多量的数码,所以规定上传文件必须是post方法,<input>的type属性必须是file。

例如:Location.href=encodeURI(“”);

三、  js使用数据时能够采取escape

例如:搜藏中history纪录。

四、 
escape对0-255以外的unicode值进行编码时输出%u****格式,别的意况下escape,encodeU奥迪Q5I,encodeUPRADOIComponent编码结果同样。

最多应用的应为encodeUPAJEROIComponent,它是将中文、保加利亚语等特殊字符转换到utf-八格式的url编码,所以假使给后台传递参数需求使用encodeUBMWX三IComponent时须要后台解码对utf-八援救(form中的编码格局和脚下页面编码情势相同)

escape不编码字符有711个:*,+,-,.

1. + U猎豹CS六L 中+号表示空格 %2B 二. 空格
UQX56L中的空格能够用+号或然编码 %20 三. / 分隔目录和子目录 %二F 4. ?
分隔实际的 U奇骏L 和参数 %三F 5….

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图