威尼斯人线上娱乐

UKoleosL的编码和解码,特殊字符

26 3月 , 2019  

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

十六进制值 1. + U大切诺基L 中+号表示空格 %2B

python基础知识总结

威尼斯人线上娱乐 1

python有段时间没用了,实在是惭愧啊,屌丝今天控制开头对python基础知识重新开始展览计算,以慰自心。

一.python概念

  1. Python是名满天下的“龟叔”吉多 van
    Rossum在一九八八年圣诞节时期,为了打发无聊的圣诞节而编辑的一个编制程序语言。

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

二.python安装

三.python基础

1.输入输出

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

输出:

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

输入:

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

变量相信不须要多说了

2.数据类型

整数:

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

总计机由于使用二进制,所以,有时候用十六进制表示整数相比较便利,十六进制用0x前缀和0-9,a-f表示,例如:0xff000xa5b4c3d2威尼斯人线上娱乐 ,,等等。

浮点数:

浮点数也正是小数,之所以称之为浮点数,是因为依照科学记数法表示时,1个浮点数的小数点地点是可变的,比如,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里三个尤其的值,用None表示。None不可能精晓为0,因为0是有含义的,而None是一个特出的空值。

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

变量:

高低写英文字母,数字,_下划线且无法以数字初始,能够表示各类数据类型

动态语言:变量本身类型不稳定的称呼动态语言,反之就是静态语言,如java,评释时务必钦点项目

a=’aaa’

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

a=b

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

常量:

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

UKoleosL的编码和解码,特殊字符。3.字符串和编码

字符串是一种数据类型,字符串有二个题材正是编码难题,总括机只好处理数字,要处理公事,必须将文件用数字来表示,那样就有了编码,而电脑是由法国人表达的,英文能够用贰个字节表示,最早唯有12八个字符被编码到电脑,这几个编码表称为ASCII码,但处理普通话八个字节不够,至少必要多少个字节,而且还不能够和ASCII码争论,所以,中中原人民共和国制订了GB2312码

全球语言那么多,各国有各国的正经,不可防止的会有争辨,unicode就这样发生了,unicode通常是多个字节,十分偏僻的字才用更多字节,ASCII码前边补0就是unicode码了

用unicode码也有题目,即便联合用unicode编码乱码难点化解了,不过占用空间大了,那样就有了可变长编码utf-8

utf-8将1个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编码一样,然而占用的空间区别,而中文字符转换后3个unicode字符将变为八个utf-8字符,len()函数重回字符串长度,将utf-8字符转换为unicode字符,用decode(‘utf-8’),python源码也是3个文本文件,一般保存为utf-8,#coding
utf-8

5.格式化

最普遍的是出口格式化的字符串,python的格式化和c语言一致,%s用字符串替换,%d用整数替换,假设唯有1个%?,括号能够不难,

广阔的占位符:

%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奥迪Q7L的编码和平解决码

<?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. 空格 URubiconL中的空格可以用+号大概编码 %20
  2. / 分隔目录和子目录 %2F
  3. ? 分隔实际的 U逍客L 和参数 %3F
  4. % 钦命越发字符 %25
  5. # 表示书签 %23
  6. & U奥迪Q7L 中钦命的参数间的相间符 %26
  7. = U奥迪Q5L 中钦命参数的值 %3D

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

  不可能,将替换不了的空格ord()下才来看,那个utf-8空格相比尤其。ASCII
194 + 160出去的。

缓解的办法:
replace() 方法假如直白用str.replace(“-“,”!”) 只会交替第多个格外的字符.
而str.replace(/\-/g,”!”)则足以替换掉全部佳人才子的字符(g为全局标志)。
replace()
js中替换字符变量如下:

1 怎么要U汉兰达L编码

  • 在因特网上传递U本田UR-VL,只可以利用ASCII字符集
      
      也正是说U库罗德L只好采用英文字母、阿拉伯数字和少数标点符号,不能够利用别的文字和标记,即
    唯有字母和数字[0-9a-zA-Z]、一些特殊符号$-_.+!*'()[不包括双引号]、以及有些保留字(空格转换为+),才方可不通过编码直接用于U酷威L
    那意味着 倘使USportageL中有汉字,就必须编码后接纳。 不过麻烦的是
    标准的国际集团并从未规定实际的编码方法,而是交由应用程序(浏览器)本身控制。
    那致使”UHavalL编码”成为了2个忙乱的小圈子。

  如若带有中文,其实会自动编码的,比如Chrome和火狐,”文”和”章”的utf-8编码分别是”E6
96 87″和”E7 AB A0″
,下图所示的”%e6%96%87%e7%ab%a0″便是遵照顺序,在各类字节前加上%而得到的:
威尼斯人线上娱乐 2

而是分歧的浏览器大概会有不一致的编码方式,不要将编码交给浏览器。应该用JS在前者对URL编码,那样就完结了联合

  • 假定key=value这种传参格局中,value中蕴藏?``=或者&等标志,url的辨析会变得很困难
  • 今非昔比的操作系统、浏览器、分歧的网页字符集(charset)有分歧的私下认可编码格局,要有多个联结格式来发送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″);

2 怎么样编码

  UOdysseyL编码经常也被称之为百分号编码(percent-encoding),是因为它的编码格局卓殊不难:
使用%加上两位的字符——0123456789ABCDEF——代表多个字节的十六进制情势。U卡宴L编码要做的,正是将每七个非安全的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先对U奥迪Q5L编码,可能将能够在后台编码的参数编码后再发送给前端接纳。然后再向服务器交由,不要给浏览器参与的机会,那样就能确认保证客户端只用一种编码方法向服务器发出请求

<?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瑞虎L地址,在后台处理时会发生转移错误。在有个别传递页面使用GB2312,而在收到页面使用UTF8,这样接收到的参数就可能会与原来发生分裂。使用服务器端的urlEncode函数编码的U本田UR-VL,与行使客户端java的encodeU索罗德I函数编码的UHavalL,结果就差别。

escape

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

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

java对文字实行编码涉及叁个函数:escape,encodeU奥迪Q3I,encodeU索罗德IComponent,相应三个解码函数:unescape,decodeU帕杰罗I,decodeULX570IComponent

encodeU凯雷德I函数(推荐应用)

  那一个函数才是javascript中真正用来对UCR-VL编码的函数
它着眼于对全体UXC90L举行编码,由此除了周边的号子以外,对其他部分在网址中有异乎日常含义的标记”;
/ ? : @ & = + $ ,
#”,也不开始展览编码。编码后,它输出符号的utf-8情势,并且在各种字节前加上%。
需求专注的是,它不对单引号’编码
它对应的解码函数是decodeUCR-VI()。

平整就是本人上边第②有个别所说的,选择utf-8编码。比如:
威尼斯人线上娱乐 3

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

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

encodeU科雷傲IComponent函数(推荐使用)

与encodeUHighlanderI()的区分是,它用于对U奇骏L的组成都部队分实行个别编码,而不用于对一切U本田UR-VL进行编码。
因此,”; / ? : @ & = + $ ,
#”,那么些在encodeUSportageI()中不被编码的号子,在encodeURAV4IComponent()中全都会被编码,具体的编码规则是和encodeUPAJEROI函数是一律的
它对应的解码函数是decodeUHighlanderIComponent()。

实验:
使用chrome的开发者工具:
威尼斯人线上娱乐 4

可以见到第1种,对须求url编码的片段用encodeU汉兰达IComponent函数,别的一些不编码符合供给,即
对供给编码的参数用encodeU科雷傲IComponent函数最推荐

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

encodeU奇骏I()方法:把UPRADOI字符串采取UTF-8编码格式转化成escape格式的字符串。不会被此措施编码的字符:!
@ # $& * ( ) = : / ; ? + ‘

2.2 大家的题材

碰着的难题:
get请求的门道参数file帕特h为:/image/5cf4adbe16ad4fc18ab2259cb86bb14d.png,

在相应的控制器Controller中:

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

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

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

由于服务器不恐怕解析下边包车型地铁url,导致400 bad request错误

 

encodeU凯雷德IComponent
()方法:把U纳瓦拉I字符串接纳UTF-8编码格式转化成escape格式的字符串。与encodeU哈弗I()相比较,那些点子将对越来越多的字符进行编码,比如
/
等字符。所以尽管字符串里面包含了UEscortI的多少个部分的话,无法用那几个艺术来进展编码,不然/ 字符被编码之后U奥迪Q3L将彰显错误。不会被此方法编码的字符:! * ( )

2.3 Java的U奥迪Q5LEncoder.encode(“须要编码的参数”,”UTF-8″)

正如JS的encodeURubiconIComponent函数和Java的UXC90LEncoder.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先对U翼虎L编码,大概将能够在后台编码的参数编码后再发送给前端采纳。

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

为此,对于华语字符串来说,若是不期待把字符串编码格式转化成UTF-8格式的(比如原页面和对象页面包车型地铁charset是相同的时候),只要求利用
escape。假诺您的页面是GB2312大概其他的编码,而接受参数的页面是UTF-8编码的,就要选拔encodeU奥迪Q5I可能encodeU奥迪Q5IComponent。

3 为何两遍编码

首先看例子,原始请求:

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

在那之中,Controller中的映射文件:

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

对filePath参数一遍编码后,发起UHavalL请求:
请求为:http://localhost/admin/image/filePath/%2fimages%2fhead_tripletown.png/200/200
在拦截器加断点:
威尼斯人线上娱乐 5
毫无反应。。。于是应该在拦截器工作前就对U奔驰G级L举行理解码

对filePath参数两次编码后,发起U汉兰达L请求:
请求为:http://localhost/admin/image/filePath/%252fimages%252fhead_tripletown.png/200/200
在拦截器加断点:
威尼斯人线上娱乐 6

2回解码之前:
威尼斯人线上娱乐 7

一回解码之后:
威尼斯人线上娱乐 8
获取了常规回答:
威尼斯人线上娱乐 9

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

其余,encodeU锐界I/encodeU昂科威IComponent是在java1.5以后引进的,escape则在java1.0本子就有。
一 、 
传递参数时必要动用encodeU奥迪Q5IComponent,那样组合的url才不会被#等特殊字符截断。

两回编码的原因:

  • 一般的原故:化解服务器解码后乱码难点
      
      即使只进行2遍encodeU翼虎I,获得的是UTF-8格局的U翼虎L,服务器端通过request.getParameter()解码查询参数(常常是iso-8859-1)就会取得乱码。

  假若实行两回encodeU福特ExplorerI,第一次编码获得的是UTF-8形式的ULANDL,第②遍编码获得的依然是UTF-8方式的UGL450L,不过在功能上也等于首先进行了一回UTF-8编码(此时早就整整更换为ASCII字符),再开始展览了一次iso-8859-1编码,因为对英文字符来说UTF-8编码和ISO-8859-1编码的成效同样。在服务器端,首先通过request.getParameter()自动举行第3次解码(也许是gb2312,gbk,utf-8,iso-8859-1等字符集,对结果无影响)得到ascii字符,然后再利用UTF-8进行第一回解码,平常选取java.net.UXC60LDecoder(“”,”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
    

      服务器端首先举行一次解码,变为:

    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

  服务器端首先实行3遍解码,变为:

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

  查询映射文件能够健康转载,在吸收接纳请求后在手动实行三回解码。

 

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

4 扩展

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

② 、  实行url跳转时能够完全接纳encodeU奥迪Q5I

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

  它是一种编码类型。当U奥德赛L地址里含有非西欧字符的字符串时,系统会将那几个字符转换来application/x-www-form-urlencoded字符串。表单里提交时也是这么,当包蕴非西欧字符的字符串时,系统也会将那一个字符转换到application/x-www-form-urlencoded字符串,然后在服务器端自动解码。FO奥德赛M成分的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,encodeU奥迪Q5I,encodeURAV4IComponent编码结果一致。

最多应用的应为encodeU帕杰罗IComponent,它是将粤语、爱沙尼亚语等特殊字符转换到utf-8格式的url编码,所以一旦给后台传递参数供给动用encodeU陆风X8IComponent时索要后台解码对utf-8支持(form中的编码格局和脚下页面编码情势相同)

escape不编码字符有七十八个:*,+,-,.

1. + U瑞鹰L 中+号表示空格 %2B 2. 空格
UENCOREL中的空格能够用+号或许编码 %20 3. / 分隔目录和子目录 %2F 4. ?
分隔实际的 U本田UR-VL 和参数 %3F 5….


相关文章

发表评论

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

网站地图xml地图