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

十六进制值 1. + U帕杰罗L 中+号表示空格 %2B

python基础知识总括

金沙注册送58 1

python有段时日没用了,实在是惭愧啊,屌丝今日控制初阶对python基础知识重新进行总计,以慰自心。

一.python概念

  1. Python是老牌的“龟叔”吉多 van
    罗斯尔um在一九八九年圣诞节以内,为了消磨无聊的圣诞节而编辑的1个编制程序语言。

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

二.python安装

三.python基础

1.输入输出

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

输出:

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

U宝马7系L的编码和解码,8空格惹的祸。输入:

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

变量相信不必要多说了

2.数据类型

整数:

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

总计机由于应用二进制,所以,有时候用十六进制表示整数比较便宜,十六进制用0x前缀和0-9,a-f表示,例如:0xff000xa5b4c3d2,等等。

浮点数:

浮点数也正是小数,之所以称为浮点数,是因为依据科学记数法表示时,二个浮点数的小数点地方是可变的,比如,1.23×109和12.3×108是相当的。浮点数能够用数学写法,如1.233.14-9.01,等等。不过对于相当的大或相当小的浮点数,就务须用科学计数法表示,把10用e替代,1.23×109就是1.23e9,或者12.3e8,0.000012方可写成1.2e-5,等等。

平头和浮点数在微型计算机内部存款和储蓄的方法是例外的,整数运算永远是准确的(除法难道也是精确的?是的!),而浮点数运算则可能会有四舍五入的误差。

字符串:

字符串是以”或””括起来的私下文本,比如'abc'"xyz"等等。请留心,”或””本身只是一种象征方法,不是字符串的一部分,因而,字符串'abc'只有abc这3个字符。如果'笔者也是叁个字符,那就足以用””括起来,比如"I'm OK"涵盖的字符是I'm,空格,OK这6个字符。

假若字符串内部既涵盖’又饱含”怎么办?能够用转义字符\来标识,比如:转义字符\能够转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\意味着的字符便是\

若果字符串里面有众多字符都需求转义,就需求加很多\,为了简化,Python还允许用r”表示”内部的字符串默许不转义

即使字符串内部有成都百货上千换行,用\n写在一行里倒霉阅读,为了简化,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里2个出奇的值,用None表示。None不可能知道为0,因为0是有意义的,而None是多个奇特的空值。

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

变量:

大大小小写英文字母,数字,_下划线且无法以数字初步,能够代表各个数据类型

动态语言:变量本人类型不固定的号称动态语言,反之就是静态语言,如java,证明时必须钦赐项目

a=’aaa’

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

a=b

意味着将a变量指向b变量的值

常量:

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

3.字符串和编码

字符串是一种数据类型,字符串有多个标题正是编码难点,计算机只可以处理数字,要拍卖文件,必须将文件用数字来代表,那样就有了编码,而总结机是由瑞典人发明的,英文能够用多个字节表示,最早只有12七个字符被编码到计算机,那一个编码表称为ASCII码,但处理普通话一个字节不够,至少需求三个字节,而且还不可能和ASCII码争论,所以,中夏族民共和国制定了GB2312码

五洲语言那么多,各国有各国的科班,不可幸免的会有冲突,unicode就这么发生了,unicode平常是多少个字节,非常偏僻的字才用越来越多字节,ASCII码后边补0正是unicode码了

用unicode码也不日常,就算联合用unicode编码乱码难点一举成功了,然则占用空间大了,这样就有了可变长编码utf-8

utf-8将3个unicode字符依据不相同数字大作者码成1-伍个字节,常用的英文字母编码为贰个字节,汉字常常多个字节,很生疏的字符才会编码成4-四个字节,假设用于大气英文,utf-8能够省去触目皆是上空。UTF-8还叁个利益就是ASCII码实际能够用作utf-8的一局地,多量支撑ASCII码的历史遗留软件能够在utf-8编码下一连做事。

搞领会了ASCII、Unicode和UTF-8的涉及,大家就能够总括一下现行电脑体系通用的字符编码工作格局:

在电脑内部存款和储蓄器中,统一运用Unicode编码,当须求保留到硬盘大概供给传输的时候,就转换为UTF-8编码。

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

浏览网页的时候,服务器会把动态变化的Unicode内容转换为UTF-8再传输到浏览器,所以你看来不可胜言网页的源码上会有近似<meta
charset=”UTF-8″ />的消息,表示该网页便是用的UTF-8编码。

4.python字符串

python诞生比unicode早,所以最早的python只补助ASCII码,字母和数字对应,python提供了ord()和chr()函数将字母和相应的数字兑换,python后来添加了对unicode扶助,unicode字符串表示u’…’,’…’能够看做utf-8编码或许ASCII编码,不过u’…’只可以当做unicode编码,英文表示的unicode编码和utf-8编码一样,可是占用的空间不一样,而中文字符转换后三个unicode字符将变为八个utf-8字符,len()函数重返字符串长度,将utf-8字符转换为unicode字符,用decode(‘utf-8’),python源码也是二个文本文件,一般保存为utf-8,#coding
utf-8

5.格式化

最广泛的是出口格式化的字符串,python的格式化和c语言一致,%s用字符串替换,%d用整数替换,要是唯有一个%?,括号能够差不离,

大面积的占位符:

%s 字符串

%d整数

%f 浮点数

%x 十六进制整数

记住:格式化整数和浮点数能够钦命是还是不是补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基础知识重新展开总计,以慰自心。
一.python概念 Pytho…

U凯雷德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. 空格 U途乐L中的空格能够用+号也许编码 %20
  2. / 分隔目录和子目录 %2F
  3. ? 分隔实际的 U普拉多L 和参数 %3F
  4. % 钦定越发字符 %25
  5. # 表示书签 %23
  6. & U奇骏L 中钦点的参数间的相间符 %26
  7. = UPRADOL 中内定参数的值 %3D

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

  无法,将替换不了的空格ord()下才来看,这么些utf-8空格相比较新鲜。ASCII
194 + 160出来的。

焚林而猎的法子:
replace() 方法假如直接用str.replace(“-“,”!”) 只会交替第一个13分的字符.
而str.replace(/\-/g,”!”)则足以替换掉全数同盟的字符(g为全局标志)。
replace()
js中替换字符变量如下:

1 为何要URAV4L编码

  • 在因特网上传递U奥德赛L,只好动用ASCII字符集
      
      也便是说U帕杰罗L只可以利用英文字母、阿拉伯数字和某个标点符号,不可能使用别的文字和符号,即
    唯有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'()[不包涵双引号]、以及一些保留字(空格转换为+),才足以不通过编码直接用来UCR-VL
    那表示 要是U中华VL中有汉字,就非得编码后采用。 然而劳动的是
    标准的国际组织并不曾明确切实的编码方法,而是交由应用程序(浏览器)本身支配。
    那造成”U汉兰达L编码”成为了八个零乱的圈子。

  假若带有中文,其实会自动编码的,比如Chrome和火狐,”文”和”章”的utf-8编码分别是”E6
96 87″和”E7 AB A0″
,下图所示的”%e6%96%87%e7%ab%a0″就是依据顺序,在各样字节前加上%而得到的:
金沙注册送58 2

唯独分裂的浏览器大概会有差别的编码情势,不要将编码交给浏览器。应该用JS在前者对U智跑L编码,那样就落实了联合

  • 借使key=value那种传参格局中,value中涵盖?``=或者&等标志,url的辨析会变得很狼狈
  • 不等的操作系统、浏览器、差别的网页字符集(charset)有不一样的暗中认可编码格局,要有二个联合格式来发送url,参考小说中举了5个例子(很有读的必不可少)!
<?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″);

2 怎么样编码

  U智跑L编码平日也被叫作百分号编码(percent-encoding),是因为它的编码格局格外不难:
使用%加上两位的字符——0123456789ABCDEF——代表多少个字节的十六进制情势。URL编码要做的,正是将每多个非安全的ASCII字符都被调换为“%xx”格式,
对于非ASCII字符,瑞虎FC文书档案建议使用utf-8对其进展编码获得相应的字节,然后对种种字节执行百分号编码。
如”粤语”使用UTF-8字符集获得的字节为0xE4 0xB8 0xAD 0xE6 0x96
0x87,经过Url编码之后获得”%E4%B8%AD%E6%96%87″。

一部分常见的特出字符换到对应的十六进制的值:

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

  实验下那些空格。

其它部分材质。。。仅供参考。。。

2.1 JS的二种编码函数

  下面说了编码方式的糊涂,那么怎么着联合吗?
应用Javascript先对UWranglerL编码,也许将能够在后台编码的参数编码后再发送给前端选拔。然后再向服务器交由,不要给浏览器到场的火候,那样就能担保客户端只用一种编码方法向服务器发出请求

<?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实行参数字传送递时,常常会传送一些华语名(或带有特殊字符)的参数或U奥迪Q3L地址,在后台处理时会产生转移错误。在多少传递页面使用GB2312,而在接收页面使用UTF8,那样接收到的参数就大概会与原来发生分歧。使用劳务器端的urlEncode函数编码的ULX570L,与使用客户端java的encodeU福特ExplorerI函数编码的U福睿斯L,结果就不一致等。

escape

  js中编码出生最早的2个,不提倡使用,真正意义是:
回到三个字符的Unicode编码值,为的是方便他们能在享有电脑上可读,规则:
全体空格、标点以及其余非ASCII字符都用%xx编码替换; 例如空格重临的是%20
字符值大于255的字符以%uxxxx格式储存

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

java对文字进行编码涉及2个函数:escape,encodeU昂科雷I,encodeUTiguanIComponent,相应叁个解码函数:unescape,decodeULacrosseI,decodeURIComponent

encodeULANDI函数(推荐应用)

  那几个函数才是javascript中的确用来对U卡宴L编码的函数
它着眼于对全数UPRADOL举办编码,因而除了常见的符号以外,对其余一些在网址中有独特含义的标记”;
/ ? : @ & = + $ ,
#”,也不开始展览编码。编码后,它输出符号的utf-8形式,并且在各样字节前加上%。
亟需专注的是,它不对单引号’编码
它对应的解码函数是decodeUOdysseyI()。

规则正是自家上面第③局地所说的,选用utf-8编码。比如:
金沙注册送58 3

  ||||####金沙注册送58 ,4####|–|####|–|

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

encodeU奥迪Q5IComponent函数(推荐应用)

与encodeU中华VI()的区分是,它用来对U奔驰M级L的组成都部队分实行个别编码,而不用于对全体URL进行编码。
因此,”; / ? : @ & = + $ ,
#”,那一个在encodeU翼虎I()中不被编码的标记,在encodeU逍客IComponent()中全都会被编码,具体的编码规则是和encodeULacrosseI函数是一律的
它对应的解码函数是decodeURIComponent()。

实验:
利用chrome的开发者工具:
金沙注册送58 4

能够观察第②种,对急需url编码的一部分用encodeUHighlanderIComponent函数,别的部分不编码符合必要,即
对急需编码的参数用encodeU昂CoraIComponent函数最推荐

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

encodeUPAJEROI()方法:把U兰德奔驰M级I字符串采取UTF-8编码格式转化成escape格式的字符串。不会被此情势编码的字符:!
@ # $& * ( ) = : / ; ? + ‘

2.2 大家的难点

遇见的标题:
get请求的路子参数filePath为:/image/5cf4adbe16ad4fc18ab2259cb86bb14d.png,

在相应的控制器Controller中:

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

那么那一个请求就成为了:

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

是因为服务器无法解析上边的url,导致400 bad request错误

 

encodeU中华VIComponent
()方法:把UQX56I字符串采取UTF-8编码格式转化成escape格式的字符串。与encodeU翼虎I()相比较,这几个艺术将对越来越多的字符实行编码,比如
/
等字符。所以假如字符串里面包括了U翼虎I的几个部分的话,不能够用那个法子来进展编码,不然/ 字符被编码之后UOdysseyL将呈现错误。不会被此格局编码的字符:! * ( )

2.3 Java的U兰德库罗德LEncoder.encode(“供给编码的参数”,”UTF-8″)

正如JS的encodeUXC60IComponent函数和Java的U昂CoraLEncoder.encode(“须求编码的参数”,”UTF-8″)函数:
//中国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先对UCRUISERL编码,或然将得以在后台编码的参数编码后再发送给前端采纳。

  难题的源点,在于UTF-8这种编码里面,存在一个格外的字符,其编码是“0xC2
0xA0”(194
160),转换到字符的时候,表现为1个空格,跟一般的半角空格(ASCII
0x20)一样,唯一的不如是它的拉长率不会被减弱,因而相比较多的被用来网页排版(如首行缩进之类)。而其他的编码格局如GB231② 、Unicode之类并从未如此的字符。

故而,对于华语字符串来说,即使不愿意把字符串编码格式转化成UTF-8格式的(比如原页面和对象页面包车型地铁charset是一致的时候),只需求使用
escape。倘使您的页面是GB2312只怕其余的编码,而接受参数的页面是UTF-8编码的,就要动用encodeUGL450I也许encodeU福特ExplorerIComponent。

3 为啥五次编码

首先看例子,原始请求:

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

里头,Controller中的映射文件:

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

对file帕特h参数三遍编码后,发起ULANDL请求:
请求为:http://localhost/admin/image/filePath/%2fimages%2fhead_tripletown.png/200/200
在拦截器加断点:
金沙注册送58 5
毫无反应。。。从而理应在拦截器工作前就对ULX570L进行领会码

对filePath参数三次编码后,发起U帕JeroL请求:
请求为:http://localhost/admin/image/filePath/%252fimages%252fhead_tripletown.png/200/200
在拦截器加断点:
金沙注册送58 6

一回解码此前:
金沙注册送58 7

二回解码之后:
金沙注册送58 8
赢得了正规回答:
金沙注册送58 9

  总计下来就是:轮换不了的字符,打字与印刷出ASCII码来总能替换掉吧。

别的,encodeU劲客I/encodeUSportageIComponent是在java1.5事后引进的,escape则在java1.0本子就有。
壹 、 
传递参数时索要运用encodeU福睿斯IComponent,那样组合的url才不会被#等特殊字符截断。

四次编码的来头:

  • 诚如的原因:消除服务器解码后乱码难点
      
      如若只进行2次encodeU奥德赛I,得到的是UTF-8方式的U陆风X8L,服务器端通过request.getParameter()解码查询参数(日常是iso-8859-1)就会获取乱码。

  要是展开一遍encodeUGL450I,第二遍编码获得的是UTF-8格局的ULX570L,第3遍编码获得的仍旧是UTF-8情势的U福睿斯L,不过在职能上一定于首先举办了1回UTF-8编码(此时早已全副变换为ASCII字符),再开始展览了3次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO-8859-1编码的作用一样。在劳务器端,首先通过request.getParameter()自动进行第三次解码(也许是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)获得ascii字符,然后再选用UTF-8举行第二遍解码,平时使用java.net.UGL450LDecoder(“”,”UTF-8″)方法。

  四次编码两遍解码的进程为:

UTF-8编码->UTF-8(iso-8859-1)编码->iso-8859-1解码->UTF-8解码,编码和平化解码的进度是对称的,所以不会现出乱码。

  • 笔者们的来由:消除400 bad request错误
      
      由于大家发送的乞请为:

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

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

    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

  查询映射文件能够健康转载,在收到请求后在手动实行3遍解码。

 

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

4 扩展

参考:缓解采集UTF-8网页空格变成问号乱码  诡异的UTF8空格

二 、  实行url跳转时能够完全应用encodeU瑞鹰I

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

  它是一种编码类型。当UEvoqueL地址里富含非西欧字符的字符串时,系统会将那几个字符转换来application/x-www-form-urlencoded字符串。表单里提交时也是这么,当包蕴非西欧字符的字符串时,系统也会将这一个字符转换到application/x-www-form-urlencoded字符串,然后在劳务器端自动解码。FOKoleosM成分的enctype属性钦命了表单数据向服务器交由时所利用的编码类型,暗中同意的缺省值是“application/x-www-form-urlencoded。

  然则,在向服务器发送多量的文本、包蕴多量非ASCII字符的文本或二进制数据时那种编码格局功效非常的低。那个时候大家将要动用另一种编码类型“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,encodeUPRADOI,encodeU奥迪Q3IComponent编码结果同样。

最多选用的应为encodeU索罗德IComponent,它是将普通话、葡萄牙语等特殊字符转换到utf-8格式的url编码,所以一旦给后台传递参数必要运用encodeUXC90IComponent时索要后台解码对utf-8帮助(form中的编码格局和当下页面编码形式相同)

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

1. + U昂科威L 中+号表示空格 %2B 2. 空格
ULX570L中的空格能够用+号可能编码 %20 3. / 分隔目录和子目录 %2F 4. ?
分隔实际的 UPAJEROL 和参数 %3F 5….

相关文章

网站地图xml地图