二回坑爹的小bug。读取豆蔻梢头段文字(编码utf-8),想替换掉空格,str_replace(”
“..)、preg_replace(“/s/”..)都不起功用。

十三进制值 “) 只会替换第一个匹配的字符.,首先需要注意的就是编码问题。1. + USportageL 中+号表示空格 %2B

本章目录

  • Part One:字符编码
  • Part Two:字符串
  • Part Three:字符串格式化

字符串能够说是具备造成语言中应用最广大的数据类型,Python也不例外。而拍卖字符串,首先须要小心的正是编码难题。

<?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中华VL中的空格能够用+号大概编码 %20
  2. / 分隔目录和子目录 %2F
  3. ? 分隔实际的 UPRADOL 和参数 %3F
  4. % 钦赐非常字符 %25
  5. # 表示书签 %23
  6. & ULX570L 中内定的参数间的相间符 %26
  7. = U本田CR-VL 中钦点参数的值 %3D

字符编码

计算机的真面目实际上就是由0和1结合的,所以说不管中文依然丹麦语字符串,末了都要更动为数字。
最先唯有1二十七个字符被编码到计算机里,也正是大大小小写拉脱维亚语字母、数字和一些标志,那么些编码表被叫做ASCII编码。
唯独要管理普通话显著一个字节是缺乏的,最少需求三个字节,何况还无法和ASCII编码矛盾,所以,中国制订了GB2312编码,用来把中文编进去。
后来吗,为了管理越来越多的言语,Unicode应际而生。Unicode把具备语言都合併到意气风发套编码里,这样就不会再有乱码难点了。
Python2.x种类正是用的ASCII编码,而Python3.x就起来运用unicode了,那样普通话显示难题就有了非常大的改过。这里打字与印刷了刹那间windows下Python3.6的各个编码:

图片 1

Python编码.png

能够见到,基本统大器晚成为了utf-8。那么哪些是utf-8呢?utf-8其实是三个可变长编码。它把八个Unicode字符依照分裂的数字大作者码成1-6个字节,常用的拉脱维亚语字母被编码成1个字节,汉字平日是3个字节,独有很生分的字符才会被编码成4-6个字节。假若您要传输的手袋蕴大量保加利亚语字符,用UTF-8编码就会节省空间:

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

从下面的表格还足以窥见,UTF-8编码有叁个额外的好处,便是ASCII编码实际上能够被看作是UTF-8编码的一片段,所以,多量只帮忙ASCII编码的历史遗留软件能够在UTF-8编码下继续做事。
在微机内部存款和储蓄器中,统生机勃勃行使Unicode编码,当须要保留到硬盘或然须要传输的时候,就转换为UTF-8编码。
用记事本编辑的时候,从文件读取的UTF-8字符被撤换为Unicode字符到内存里,编辑实现后,保存的时候再把Unicode转变为UTF-8保存到文件:

图片 2

image.png

  无法,将替换不了的空格ord()下才来看,这几个utf-8空格比较特别。ASCII
194 + 160出去的。

缓和的不二秘诀:
replace() 方法倘诺直接用str.replace(“-“,”!”) 只会轮换第二个十三分的字符.
而str.replace(/-/g,”!”)则足以替换掉全体合营的字符(g为全局标识)。
replace()
js中替换字符变量如下:

字符串

字符串就是用单引号(‘)或然双引号(“”)包裹起来的文字,在Python风格标准里引入叁个模块使用风流罗曼蒂克种标识作为字符串表示。在字符串内能够使用其余朝气蓬勃种引号,
以幸免在字符串中应用。
例如:

print('Why are you hiding your eyes?')
print("I'm scared of lint errors.")
print('"Good!" thought a happy Python reviewer.')

结果为:

图片 3

String.png

因而说,除非想在字符串内蕴含单引号大概双引号,每三个Python文件最佳应用相近种标记。
对于单个字符的编码,Python提供了ord()函数获取字符的大背头表示,chr()函数把编码转变为相应的字符:

图片 4

ord和chr.png

万生机勃勃精晓字符的整数编码,还能用十四进制这么写str(unicode情势卡塔尔国:

图片 5

uniode中文.png

若是要在网络上传输,只怕封存到磁盘上,就需求把str变为以字节为单位的bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示:

var = b"ABC"

要专心区分’ABC’和b’ABC’,前面一个是str,前面一个即使内容展现得和前边叁个相符,但bytes的每一个字符都只占用叁个字节。
以Unicode表示的str通过encode()方法能够编码为内定的bytes,举个例子:

图片 6

encode.png

纯克罗地亚语的str能够用ASCII编码为bytes,内容是相符的,含有普通话的str能够用UTF-8编码为bytes。含有粤语的str无法用ASCII编码,因为普通话编码的范围超越了ASCII编码的界定,Python会报错。
扭曲,从bytes到str能够用decode方法,原理和操作都以均等的,不再赘述了。
聊起底,可以看下len方法,len是length的缩写,翻译过来正是总计str或许bytes的字符字节数,比方:

图片 7

len.png

看得出,1此中文字符经过UTF-8编码后通常会占领3个字节,而1个希腊语字符仅占用1个字节。
在操作字符串时,大家日常遇上str和bytes的彼此转换。为了制止乱码难题,应当始终百折不挠使用UTF-8编码对str和bytes举办转变。
还只怕有其余一些常用的法子,如spli(分割卡塔 尔(阿拉伯语:قطر‎,
join(拼接卡塔尔,replace(替换卡塔 尔(英语:State of Qatar),upper(大写卡塔尔国,lower(小写卡塔 尔(英语:State of Qatar),strip(去除两端空格卡塔尔国,lstrip(去除左端空格卡塔 尔(英语:State of Qatar),rstrip(去除右端空格卡塔 尔(英语:State of Qatar)等,用法都比较轻松,可参考源码调用就能够。

<?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″);

字符串格式化

  1. 字符串格式化正是在内定地方先放三个占位符,然后用变量来替换,那样就能够以平等的格式输出不一样的始末。
    最简便的案比如下图所示:
![](https://upload-images.jianshu.io/upload_images/6879662-35e9e9fc9e8b349f.png)

字符串格式化.png



其中,占位符常用的有:
占位符 替换内容
%d 整数
%f 浮点数
%s 字符串
%x 十六进制整数

还应该有不菲别的占位符,不太常用,必要的时候再去查就好了。
别的,倘诺不显著,可以行使字符串占位符,因为此外品类都转载为字符串。

  1. 大胆说法是%号的措施已经过时了,用format方法来操作字符串格式化更确切。
    用作三个刚入门的学人,未有技艺去分别这多头的高低,相对来讲,个人依旧喜欢format格局多一些,感到更标准。
    format方式的底蕴用法正是用{0},{1}…来代替站位符,借使用{}代表行使暗中认可顺序,比方:
![](https://upload-images.jianshu.io/upload_images/6879662-9ba20d5a74127547.png)

format格式化.png



另外,还有一些比较详细的用法:



![](https://upload-images.jianshu.io/upload_images/6879662-a9310b98109d7212.png)

format格式化进阶.png

  实验下那些空格。

任何一些资料。。。仅供参照他事他说加以考察。。。

<?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进行参数字传送递时,常常会传送一些中文名(或带有特殊字符卡塔尔的参数或UQX56L地址,在后台管理时会发生转移错误。在有一些传递页面使用GB2312,而在收到页面使用UTF8,那样选取到的参数就恐怕会与原来爆发不雷同。使用服务器端的urlEncode函数编码的URL,与应用客户端java的encodeU中华VI函数编码的U途达L,结果就不相像。

  结果:为平价书写,|代表空格,|代表全角空格。

java对文字实行编码涉及3个函数:escape,encodeURubiconI,encodeUHavalIComponent,相应3个解码函数:unescape,decodeU中华VI,decodeUPAJEROIComponent

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

java中的编码方法:
escape() 方法:选拔ISO
Latin字符集对点名的字符串进行编码。全数的空格符、标点符号、特殊字符以致其余非ASCII字符都将被转正成%xx格式的字符编码(xx等于该字符在字符集表里面包车型客车编码的16进制数字卡塔尔。举个例子,空格符对应的编码是%20。unescape方法与此相反。不会被此办法编码的字符:
@ * / +

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

encodeU牧马人I()方法:把U大切诺基I字符串选拔UTF-8编码格式转形成escape格式的字符串。不会被此措施编码的字符:!
@ # $& * ( ) = : / ; ? + ‘

 

encodeU索罗德IComponent
()方法:把URubiconI字符串接收UTF-8编码格式转化成escape格式的字符串。与encodeU卡宴I()比较,这一个办法将对越多的字符进行编码,例如/
等字符。所以只要字符串里面含有了U奥迪Q5I的多少个部分的话,无法用那一个措施来实行编码,否则/ 字符被编码之后UCR-VL将展现错误。不会被此措施编码的字符:! * ( )

  难题的来源于,在于UTF-8这种编码里面,存在三个非常的字符,其编码是“0xC2
0xA0”(194
160),转变到字符的时候,表现为二个空格,跟平时的半角空格(ASCII
0x20卡塔 尔(阿拉伯语:قطر‎相近,唯大器晚成的不等是它的小幅不会被减削,因而超级多的被用于网页排版(如首行缩进之类卡塔 尔(阿拉伯语:قطر‎。而其他的编码形式如GB2312、Unicode之类并未那样的字符。

据此,对于华语字符串来讲,假诺不愿意把字符串编码格式转形成UTF-8格式的(举个例子原页面和对象页面包车型大巴charset是平等的时候卡塔尔国,只须要利用
escape。假诺你的页面是GB2312可能别的的编码,而选拔参数的页面是UTF-8编码的,将在动用encodeU汉兰达I恐怕encodeUPAJEROIComponent。

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

其余,encodeU奥迪Q5I/encodeU景逸SUVIComponent是在java1.5后头引进的,escape则在java1.0本子就有。
1、 
传递参数时要求使用encodeURubiconIComponent,那样组合的url才不会被#等特殊字符截断。

 

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

参考:寸草不留收罗UTF-8网页空格产生问号乱码  诡异的UTF8空格

2、  进行url跳转时能够全体应用encodeU卡宴I

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

3、  js使用数据时方可接纳escape

例如:搜藏中history纪录。

4、 
escape对0-255以外的unicode值举行编码时输出%u****格式,此外境况下escape,encodeU哈弗I,encodeU翼虎IComponent编码结果相通。

最多使用的应该为encodeU途乐IComponent,它是将中文、斯拉维尼亚语等特殊字符调换到utf-8格式的url编码,所以只要给后台传递参数供给使用encodeUXC60IComponent时须要后台解码对utf-8援助(form中的编码情势和当下页面编码方式相仿卡塔 尔(阿拉伯语:قطر‎

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

1. + U冠道L 中+号表示空格 %2B 2. 空格
U奥迪Q5L中的空格可以用+号或然编码 %20 3. / 分隔目录和子目录 %2F 4. ?
分隔实际的 U卡宴L 和参数 %3F 5….

相关文章