python 之路,致那些年,我们依然没搞明白的编码

python 之路,致那些年,我们依然没搞明白的编码

本节内容

  编码回顾

  编码转换

  Python的bytes类型

 

编码回顾

在备编码相关的课件时,在知乎上看到一段关于Python编码的回答

这哥们的这段话说的太对了,搞Python不把编码彻底搞明白,总有一天它会猝不及防坑你一把。

不过感觉这哥们的答案并没把编码问题写明白,所以只好亲自动笔了。 

折腾编码问题,有很多次,我以为自已明白了,最终发现,那只不过是自圆其说而已,这一次,终于100%确定,动笔即不再改!

 

 

看这篇文章前,你应该已经知道了为什么有编码,以及编码的种类情况

  • ASCII 占1个字节,只支持英文
  • GB2312 占2个字节,支持6700+汉字
  • GBK GB2312的升级版,支持21000+汉字
  • Shift-JIS 日本字符
  • ks_c_5601-1987 韩国编码
  • TIS-620 泰国编码

由于每个国家都有自己的字符,所以其对应关系也涵盖了自己国家的字符,但是以上编码都存在局限性,即:仅涵盖本国字符,无其他国家字符的对应关系。应运而生出现了万国码,他涵盖了全球所有的文字和二进制的对应关系,

  • Unicode 2-4字节 已经收录136690个字符,并还在一直不断扩张中...

Unicode 起到了2个作用:

  1. 直接支持全球所有语言,每个国家都可以不用再使用自己之前的旧编码了,用unicode就可以了。(就跟英语是全球统一语言一样)
  2. unicode包含了跟全球所有国家编码的映射关系,为什么呢?后面再讲

Unicode解决了字符和二进制的对应关系,但是使用unicode表示一个字符,太浪费空间。例如:利用unicode表示“Python”需要12个字节才能表示,比原来ASCII表示增加了1倍。

由于计算机的内存比较大,并且字符串在内容中表示时也不会特别大,所以内容可以使用unicode来处理,但是存储和网络传输时一般数据都会非常多,那么增加1倍将是无法容忍的!!!

为了解决存储和网络传输的问题,出现了Unicode Transformation Format,学术名UTF,即:对unicode中的进行转换,以便于在存储和网络传输时可以节省空间!

  • UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个
  • UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。
  • UTF-32: 使用4个字节表示所有字符;

总结:UTF 是为unicode编码 设计 的一种 在存储 和传输时节省空间的编码方案。

 

字符在硬盘上的存储 

无论以什么编码在内存里显示字符,存到硬盘上都是2进制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ascii编码(美国):
    l   0b1101100
    o   0b1101111
    v   0b1110110
    e   0b1100101
GBK编码(中国):
    老   0b11000000 0b11001111
    男   0b11000100 0b11010000
    孩   0b10111010 0b10100010
 
Shift_JIS编码(日本):
    私   0b10001110 0b10000100
    は   0b10000010 0b11001101
 
ks_c_5601-1987编码(韩国):
    나   0b10110011 0b10101010
    는   0b10110100 0b11000010
     
TIS-620编码(泰国):
    ฉัน  0b10101001 0b11010001 0b10111001
...
1
要注意的是,存到硬盘上时是以何种编码存的,再从硬盘上读出来时,就必须以何种编码读,要不然就乱了。。

  

编码的转换 

虽然国际语言是英语 ,但大家在自己的国家依然说自已的语言,不过出了国, 你就得会英语
编码也一样,虽然有了unicode and utf-8 , 但是由于历史问题,各个国家依然在大量使用自己的编码,比如中国的windows,默认编码依然是gbk,而不是utf-8

基于此,如果中国的软件出口到美国,在美国人的电脑上就会显示乱码,因为他们没有gbk编码。
若想让中国的软件可以正常的在 美国人的电脑上显示,只有以下2条路可走:

  1. 让美国人的电脑上都装上gbk编码
  2. 把你的软件编码以utf-8编码

第1种方法几乎不可能实现,第2种方法比较简单。 但是也只能是针对新开发的软件。 如果你之前开发的软件就是以gbk编码的,上百万行代码可能已经写出去了,重新编码成utf-8格式也会费很大力气。

so , 针对已经用gbk开发完毕的项目,以上2种方案都不能轻松的让项目在美国人电脑上正常显示,难道没有别的办法了么?
有, 还记得我们讲unicode其中一个功能是其包含了跟全球所有国家编码的映射关系,意思就是,你写的是gbk的“路飞学城”,但是unicode能自动知道它在unicode中的“路飞学城”的编码是什么,如果这样的话,那是不是意味着,无论你以什么编码存储的数据 ,只要你的软件在把数据从硬盘读到内存里,转成unicode来显示,就可以了。
由于所有的系统、编程语言都默认支持unicode,那你的gbk软件放到美国电脑 上,加载到内存里,变成了unicode,中文就可以正常展示啦。

 这个表你自己也可以下载下来 

unicode与gbk的映射表 http://www.unicode.org/charts/ 

 

Python3的执行过程

在看实际代码的例子前,我们来聊聊,python3 执行代码的过程

  1. 解释器找到代码文件,把代码字符串按文件头定义的编码加载到内存,转成unicode
  2. 把代码字符串按照语法规则进行解释,
  3. 所有的变量字符都会以unicode编码声明

编码转换过程

实际代码演示,在py3上 把你的代码以utf-8编写, 保存,然后在windows上执行,

1
2
s = '路飞学城'
print(s)

so ,一切都很美好,到这里,我们关于编码的学习按说就可以结束了。

 

但是,如生活一样,美好的表面下,总是隐藏着不尽如人意,上面的utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode , 但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是, 它的默认编码是ASCII,想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,加载到内存里,你的变量字符串就也是utf-8, 这意味着什么你知道么?。。。意味着,你以utf-8编码的文件,在windows是乱码。 

 

乱是正常的,不乱才不正常,因为只有2种情况 ,你的windows上显示才不会乱

  1. 字符串以GBK格式显示
  2. 字符串是unicode编码

既然Python2并不会自动的把文件编码转为unicode存在内存里, 那就只能使出最后一招了,你自己人肉转。Py3 自动把文件编码转为unicode必定是调用了什么方法,这个方法就是,decode(解码) 和encode(编码)

1
2
UTF-8 --> decode 解码 --> Unicode
Unicode --> encode 编码 --> GBK / UTF-8 ..

 

decode示例

 

encode 示例

 

记住下图规则

 

如何验证编码转对了呢?

1. 查看数据类型,python 2 里有专门的unicode 类型
2. 查看unicode编码映射表

  unicode字符是有专门的unicode类型来判断的,但是utf-8,gbk编码的字符都是str,你如果分辨出来的当前的字符串数据是何种编码的呢? 有人说可以通过字节长度判断,因为utf-8一个中文占3字节,gbk一个占2字节

靠上面字节个数,虽然也能大体判断是什么类型,但总觉得不是很专业。

怎么才能精确的验证一个字符的编码呢,就是拿这些16进制的数跟编码表里去匹配。

“路飞学城”的unicode编码的映射位置是 u'\u8def\u98de\u5b66\u57ce' ,‘\u8def’ 就是‘路’,到表里搜一下。
“路飞学城”对应的GBK编码是'\xc2\xb7\xb7\xc9\xd1\xa7\xb3\xc7' ,2个字节一个中文,"路" 的二进制 "\xc2\xb7"是4个16进制,正好2字节,拿它到unicode映射表里对一下, 发现是G0-4237,并不是\xc2\xb7呀。。。擦。演砸了吧。。

   

再查下“飞” \u98de ,对应的是G0-3749, 跟\xb7\xc9也对不上。

 

 

虽然对不上, 但好\xc2\xb7 和G0-4237中的第2位的2和第4位的7对上了,“飞”字也是一样,莫非巧合? 

把他们都转成2进制显示试试 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
C               2
8   4   2   1   8   4   2   1
<strong>1   1   0   0   0   0   1   0</strong>
 
B               7
8   4   2   1   8   4   2   1
<strong>1   0   1   1   0   1   1   1</strong>
 
 
B               7
8   4   2   1   8   4   2   1
1   0   1   1   0   1   1   1
 
C               9
8   4   2   1   8   4   2   1
1   1   0   0   1   0   0   1

这个“路”还是跟G0-4237对不上呀,没错, 但如果你把路\xc2\xb7的每个二进制字节的左边第一个bit变成0试试呢, 我擦,加起来就真的是4237了呀。。难道又是巧合???  

 

必然不是,是因为,GBK的编码表示形式决定的。。因为GBK编码在设计初期就考虑到了要兼容ASCII,即如果是英文,就用一个字节表示,2个字节就是中文,但如何区别连在一起的2个字节是代表2个英文字母,还是一个中文汉字呢? 中国人如此聪明,决定,2个字节连在一起,如果每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。 也就是2个高字节连在一起,必然就是一个中文。 你怎么如此笃定?因为0-127已经表示了英文的绝大部分字符,128-255是ASCII的扩展表,表示的都是极特殊的字符,一般没什么用。所以中国人就直接拿来用了。 

 

问:那为什么上面 "\xc2\xb7"的2进制要把128所在的位去掉才能与unicode编码表里的G0-4237匹配上呢?

这只能说是unicode在映射表的表达上直接忽略了高字节,但真正映射的时候 ,肯定还是需要用高字节的哈。

 

Python bytes类型

在python 2 上写字符串

1
2
3
4
5
>>> s = "路飞"
>>> print s
路飞
>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e'

虽说打印的是路飞,但直接调用变量s,看到的却是一个个的16进制表示的二进制字节,我们怎么称呼这样的数据呢?直接叫二进制么?也可以, 但相比于010101,这个数据串在表示形式上又把2进制转成了16进制来表示,这是为什么呢? 哈,为的就是让人们看起来更可读。我们称之为bytes类型,即字节类型, 它把8个二进制一组称为一个byte,用16进制来表示。  

说这个有什么意思呢?

想告诉你一个事实, 就是,python2的字符串其实更应该称为字节串。 通过存储方式就能看出来, 但python2里还有一个类型是bytes呀,难道又叫bytes又叫字符串? 嗯 ,是的,在python2里,bytes == str , 其实就是一回事 

除此之外呢, python2里还有个单独的类型是unicode , 把字符串解码后,就会变成unicode

1
2
3
4
5
6
>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8
>>> s.decode('utf-8')
u'\u8def\u98de' #unicode 在unicode编码表里对应的位置
>>> print(s.decode('utf-8'))
路飞 #unicode 格式的字符


由于Python创始人在开发初期认知的局限性,其并未预料到python能发展成一个全球流行的语言,导致其开发初期并没有把支持全球各国语言当做重要的事情来做,所以就轻佻的把ASCII当做了默认编码。 当后来大家对支持汉字、日文、法语等语言的呼声越来越高时,Python于是准备引入unicode,但若直接把默认编码改成unicode的话是不现实的, 因为很多软件就是基于之前的默认编码ASCII开发的,编码一换,那些软件的编码就都乱了。所以Python 2 就直接 搞了一个新的字符类型,就叫unicode类型,比如你想让你的中文在全球所有电脑上正常显示,在内存里就得把字符串存成unicode类型

1
2
3
4
5
6
7
8
>>> s = "路飞"
>>> s
'\xe8\xb7\xaf\xe9\xa3\x9e'
>>> s2 = s.decode("utf-8")
>>> s2
u'\u8def\u98de'
>>> type(s2)
<type 'unicode'>


时间来到2008年,python发展已近20年,创始人龟叔越来越觉得python里的好多东西已发展的不像他的初衷那样,开始变得臃肿、不简洁、且有些设计让人摸不到头脑,比如unicode 与str类型,str 与bytes类型的关系,这给很多python程序员造成了困扰。
龟叔再也忍不了,像之前一样的修修补补已不能让Python变的更好,于是来了个大变革,Python3横空出世,不兼容python2,python3比python2做了非常多的改进,其中一个就是终于把字符串变成了unicode,文件默认编码变成了utf-8,这意味着,只要用python3,无论你的程序是以哪种编码开发的,都可以在全球各国电脑上正常显示,真是太棒啦!

PY3 除了把字符串的编码改成了unicode, 还把str 和bytes 做了明确区分, str 就是unicode格式的字符, bytes就是单纯二进制啦。

最后一个问题,为什么在py3里,把unicode编码后,字符串就变成了bytes格式? 你直接给我直接打印成gbk的字符展示不好么?我想其实py3的设计真是煞费苦心,就是想通过这样的方式明确的告诉你,想在py3里看字符,必须得是unicode编码,其它编码一律按bytes格式展示。 

 

好吧,就说这么多吧。 

 

 

最后再提示一下,Python只要出现各种编码问题,无非是哪里的编码设置出错了
常见编码错误的原因有:

    • Python解释器的默认编码
    • Python源文件文件编码
    • Terminal使用的编码
    • 操作系统的语言设置

掌握了编码之前的关系后,挨个排错就好啦  

 

  

 

12
0
« 上一篇:python 之路,Django rest framework 初探
» 下一篇:小白学爬虫(一)- 之初识爬虫
	</div>
	<div class="postDesc">posted @ <span id="post-date">2017-09-19 11:36</span> <a href="http://www.cnblogs.com/alex3714/">金角大王</a> 阅读(<span id="post_view_count">7684</span>) 评论(<span id="post_comment_count">19</span>) &nbsp;<a href="https://i.cnblogs.com/EditArticles.aspx?postid=7550940" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(7550940);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,cb_blogId=214271,cb_entryId=7550940,cb_blogApp=currentBlogApp,cb_blogUserGuid='64e4fae3-b5aa-e411-b908-9dcfd8948a71',cb_entryCreatedDate='2017/9/19 11:36:00';loadViewCount(cb_entryId);var cb_postType=2;</script>
	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3790040,'xERYVieKeK7Ul2TWA7RUYiVomGfPf9SR+Nnwrjx/xmZzo0lzC4fiww==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3790040,'xERYVieKeK7Ul2TWA7RUYiVomGfPf9SR+Nnwrjx/xmZzo0lzC4fiww==')">引用</a></span>
			</div>
			<a href="#3790040" class="layer">#1楼</a><a name="3790040" id="comment_anchor_3790040"></a>  <span class="comment_date">2017-09-19 19:35</span> <a id="a_comment_author_3790040" href="http://www.cnblogs.com/ugfly/" target="_blank">Ugfly</a> <a href="http://msg.cnblogs.com/send/Ugfly" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3790040" class="blog_comment_body">nb</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3790040,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3790040,'Bury',this)">反对(0)</a></div><span id="comment_3790040_avatar" style="display:none;">http://pic.cnblogs.com/face/1197724/20170711130311.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3790128,'Iu+AUvcFN5cvQpPwQacUG6JB4YK3i5Ca1/9txCqO2ZnmraHAlU9HIA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3790128,'Iu+AUvcFN5cvQpPwQacUG6JB4YK3i5Ca1/9txCqO2ZnmraHAlU9HIA==')">引用</a></span>
			</div>
			<a href="#3790128" class="layer">#2楼</a><a name="3790128" id="comment_anchor_3790128"></a>  <span class="comment_date">2017-09-19 21:01</span> <a id="a_comment_author_3790128" href="http://www.cnblogs.com/zh-20170913/" target="_blank">zhuh</a> <a href="http://msg.cnblogs.com/send/zhuh" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3790128" class="blog_comment_body">大王厉害了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3790128,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3790128,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3791742,'v26s6351O5r4oFb6e68fMyFBg2fRX+dhNH+Xmayxna7jZ0OLRqazuQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3791742,'v26s6351O5r4oFb6e68fMyFBg2fRX+dhNH+Xmayxna7jZ0OLRqazuQ==')">引用</a></span>
			</div>
			<a href="#3791742" class="layer">#3楼</a><a name="3791742" id="comment_anchor_3791742"></a>  <span class="comment_date">2017-09-21 09:45</span> <a id="a_comment_author_3791742" href="http://www.cnblogs.com/nerdlerss/" target="_blank">nerdlerss</a> <a href="http://msg.cnblogs.com/send/nerdlerss" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3791742" class="blog_comment_body">好文</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3791742,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3791742,'Bury',this)">反对(0)</a></div><span id="comment_3791742_avatar" style="display:none;">http://pic.cnblogs.com/face/947879/20160630000050.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3792485,'hre0BVZAU0owaOoXGxtVGo1W4CbxqFtpt/X3ouT84ZDcf2bgu/gwNQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3792485,'hre0BVZAU0owaOoXGxtVGo1W4CbxqFtpt/X3ouT84ZDcf2bgu/gwNQ==')">引用</a></span>
			</div>
			<a href="#3792485" class="layer">#4楼</a><a name="3792485" id="comment_anchor_3792485"></a>  <span class="comment_date">2017-09-21 17:45</span> <a id="a_comment_author_3792485" href="http://www.cnblogs.com/hzpythoner/" target="_blank">hz_pythoner</a> <a href="http://msg.cnblogs.com/send/hz_pythoner" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3792485" class="blog_comment_body">基本搞明白了,以后应该不怕编码问题了!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3792485,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3792485,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3792487,'hre0BVZAU0owaOoXGxtVGo1W4CbxqFtpt/X3ouT84ZDcf2bgu/gwNQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3792487,'hre0BVZAU0owaOoXGxtVGo1W4CbxqFtpt/X3ouT84ZDcf2bgu/gwNQ==')">引用</a></span>
			</div>
			<a href="#3792487" class="layer">#5楼</a><a name="3792487" id="comment_anchor_3792487"></a>  <span class="comment_date">2017-09-21 17:45</span> <a id="a_comment_author_3792487" href="http://www.cnblogs.com/hzpythoner/" target="_blank">hz_pythoner</a> <a href="http://msg.cnblogs.com/send/hz_pythoner" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3792487" class="blog_comment_body">Alex大王,我转发了!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3792487,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3792487,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3806357,'l1Wv5ZpjWLqZkyGhYhbK36F+xU0UFVcoQLi2eyERYDzATkbKRSwmog==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3806357,'l1Wv5ZpjWLqZkyGhYhbK36F+xU0UFVcoQLi2eyERYDzATkbKRSwmog==')">引用</a></span>
			</div>
			<a href="#3806357" class="layer">#6楼</a><a name="3806357" id="comment_anchor_3806357"></a>  <span class="comment_date">2017-10-10 15:14</span> <a id="a_comment_author_3806357" href="http://home.cnblogs.com/u/1242191/" target="_blank">无名神僧</a> <a href="http://msg.cnblogs.com/send/%E6%97%A0%E5%90%8D%E7%A5%9E%E5%83%A7" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3806357" class="blog_comment_body">牛逼,以前编码真不注重这玩意</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3806357,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3806357,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3808611,'XzSrz6NKk3DVxyPnW9pwvNDB34bnSN6gOECgdJraEJ9B32kG7DHU0w==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3808611,'XzSrz6NKk3DVxyPnW9pwvNDB34bnSN6gOECgdJraEJ9B32kG7DHU0w==')">引用</a></span>
			</div>
			<a href="#3808611" class="layer">#7楼</a><a name="3808611" id="comment_anchor_3808611"></a>  <span class="comment_date">2017-10-12 17:20</span> <a id="a_comment_author_3808611" href="http://www.cnblogs.com/kevincaptain/" target="_blank">凯文队长</a> <a href="http://msg.cnblogs.com/send/%E5%87%AF%E6%96%87%E9%98%9F%E9%95%BF" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3808611" class="blog_comment_body">alex终于讲通这一点了,。。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3808611,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3808611,'Bury',this)">反对(0)</a></div><span id="comment_3808611_avatar" style="display:none;">http://pic.cnblogs.com/face/972749/20160605124658.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3832561,'Pc8Jv83kXiMFv/d3rDqrStTDJhBLRu2E7iWSU4omMdtLr0EP1D8Apw==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3832561,'Pc8Jv83kXiMFv/d3rDqrStTDJhBLRu2E7iWSU4omMdtLr0EP1D8Apw==')">引用</a></span>
			</div>
			<a href="#3832561" class="layer">#8楼</a><a name="3832561" id="comment_anchor_3832561"></a>  <span class="comment_date">2017-11-06 18:44</span> <a id="a_comment_author_3832561" href="http://www.cnblogs.com/bagechashu/" target="_blank">bagechashu</a> <a href="http://msg.cnblogs.com/send/bagechashu" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3832561" class="blog_comment_body">s2 = s.decode("utf-8")  #unicode<br>AttributeError: 'str' object has no attribute 'decode'</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3832561,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3832561,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3833695,'Rp0arjxAYkkio7HcZDlIZGh7XDlhtI/PT7Q2Fq69Co05HNEMjV3/KQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3833695,'Rp0arjxAYkkio7HcZDlIZGh7XDlhtI/PT7Q2Fq69Co05HNEMjV3/KQ==')">引用</a></span>
			</div>
			<a href="#3833695" class="layer">#9楼</a><a name="3833695" id="comment_anchor_3833695"></a>  <span class="comment_date">2017-11-07 17:02</span> <a id="a_comment_author_3833695" href="http://www.cnblogs.com/kuaizifeng/" target="_blank">朝天阙</a> <a href="http://msg.cnblogs.com/send/%E6%9C%9D%E5%A4%A9%E9%98%99" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3833695" class="blog_comment_body">你为何如此NB。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3833695,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3833695,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3833725,'Rp0arjxAYkkio7HcZDlIZGh7XDlhtI/PT7Q2Fq69Co05HNEMjV3/KQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3833725,'Rp0arjxAYkkio7HcZDlIZGh7XDlhtI/PT7Q2Fq69Co05HNEMjV3/KQ==')">引用</a></span>
			</div>
			<a href="#3833725" class="layer">#10楼</a><a name="3833725" id="comment_anchor_3833725"></a>  <span class="comment_date">2017-11-07 17:15</span> <a id="a_comment_author_3833725" href="http://www.cnblogs.com/kuaizifeng/" target="_blank">朝天阙</a> <a href="http://msg.cnblogs.com/send/%E6%9C%9D%E5%A4%A9%E9%98%99" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3833725" class="blog_comment_body"><a href="#3832561" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3832561);">@</a>

bagechashu
s.encode('utf-8').decode('utf-8')



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3854481,'xji8NHzvTgEGIWc9y136zpv2t8viWhyn5eEEb4b7oJzxBCq5dTRUWg==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3854481,'xji8NHzvTgEGIWc9y136zpv2t8viWhyn5eEEb4b7oJzxBCq5dTRUWg==')">引用</a></span>
			</div>
			<a href="#3854481" class="layer">#11楼</a><a name="3854481" id="comment_anchor_3854481"></a>  <span class="comment_date">2017-11-30 14:18</span> <a id="a_comment_author_3854481" href="http://www.cnblogs.com/gl0899/" target="_blank">gl0899</a> <a href="http://msg.cnblogs.com/send/gl0899" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3854481" class="blog_comment_body">Mark,每次遇到编码的问题,过来再温习一遍,总有新收获!</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3854481,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3854481,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3858278,'SxdctEULecelVuRIjzY9g6pq2hsfDikKCwh1YxkZBkw+42N/uKYIDA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3858278,'SxdctEULecelVuRIjzY9g6pq2hsfDikKCwh1YxkZBkw+42N/uKYIDA==')">引用</a></span>
			</div>
			<a href="#3858278" class="layer">#12楼</a><a name="3858278" id="comment_anchor_3858278"></a>  <span class="comment_date">2017-12-05 14:31</span> <a id="a_comment_author_3858278" href="http://www.cnblogs.com/UncleYong/" target="_blank">UncleYong</a> <a href="http://msg.cnblogs.com/send/UncleYong" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3858278" class="blog_comment_body"><a href="#3832561" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,3832561);">@</a>

bagechashu
哈哈,unicode不能decode了



	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3862689,'V8ROplPaUZRDaB66xMlIcCE2vh3XfSJDbvYu8ZGjNzF/DeD3rvOjGA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3862689,'V8ROplPaUZRDaB66xMlIcCE2vh3XfSJDbvYu8ZGjNzF/DeD3rvOjGA==')">引用</a></span>
			</div>
			<a href="#3862689" class="layer">#13楼</a><a name="3862689" id="comment_anchor_3862689"></a>  <span class="comment_date">2017-12-11 11:02</span> <a id="a_comment_author_3862689" href="http://www.cnblogs.com/xnb123/" target="_blank">小牛掰</a> <a href="http://msg.cnblogs.com/send/%E5%B0%8F%E7%89%9B%E6%8E%B0" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3862689" class="blog_comment_body">写的很好,值得常年来看……</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3862689,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3862689,'Bury',this)">反对(0)</a></div><span id="comment_3862689_avatar" style="display:none;">http://pic.cnblogs.com/face/1210631/20170801080206.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3866208,'bUSghmbto9511UBpGLeikte28VRiv4DeCBMfHJKoxjQowaV2sdrC9w==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3866208,'bUSghmbto9511UBpGLeikte28VRiv4DeCBMfHJKoxjQowaV2sdrC9w==')">引用</a></span>
			</div>
			<a href="#3866208" class="layer">#14楼</a><a name="3866208" id="comment_anchor_3866208"></a>  <span class="comment_date">2017-12-14 23:48</span> <a id="a_comment_author_3866208" href="http://www.cnblogs.com/GraceZ/" target="_blank">GraceZen</a> <a href="http://msg.cnblogs.com/send/GraceZen" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3866208" class="blog_comment_body">Python bytes类型<br>在python 2 上写字符串<br>&gt;&gt;&gt; s = "路飞"<br>&gt;&gt;&gt; print s<br>路飞<br>&gt;&gt;&gt; s<br>'\xe8\xb7\xaf\xe9\xa3\x9e'<br><br>这个s在python2中,不是应该是\xc2\xb7\xb7\xc9吗,还是说编码格式设置成了utf-8啊<br><br>在老男孩学python,纯粹新手,还望赐教</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3866208,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3866208,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3866602,'1hLxFA3hWImZtzjjFzO4DsuZzGL8sOvTdEeIYCilAt3vWxPAm+WWmQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3866602,'1hLxFA3hWImZtzjjFzO4DsuZzGL8sOvTdEeIYCilAt3vWxPAm+WWmQ==')">引用</a></span>
			</div>
			<a href="#3866602" class="layer">#15楼</a><a name="3866602" id="comment_anchor_3866602"></a>  <span class="comment_date">2017-12-15 14:28</span> <a id="a_comment_author_3866602" href="http://www.cnblogs.com/mosson/" target="_blank">想做土匪的书生</a> <a href="http://msg.cnblogs.com/send/%E6%83%B3%E5%81%9A%E5%9C%9F%E5%8C%AA%E7%9A%84%E4%B9%A6%E7%94%9F" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3866602" class="blog_comment_body">大王还能写出有质量的博客,不易啊</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3866602,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3866602,'Bury',this)">反对(0)</a></div><span id="comment_3866602_avatar" style="display:none;">http://pic.cnblogs.com/face/967202/20180117200314.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3885090,'Vnh0hQebwdIWOsTU/oyr8wBMCc0bHWMxo+4yfJodP3OnnPZg+aS0pA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3885090,'Vnh0hQebwdIWOsTU/oyr8wBMCc0bHWMxo+4yfJodP3OnnPZg+aS0pA==')">引用</a></span>
			</div>
			<a href="#3885090" class="layer">#16楼</a><a name="3885090" id="comment_anchor_3885090"></a>  <span class="comment_date">2018-01-09 12:18</span> <a id="a_comment_author_3885090" href="http://www.cnblogs.com/Darksugar/" target="_blank">DarkSugar</a> <a href="http://msg.cnblogs.com/send/DarkSugar" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3885090" class="blog_comment_body">1</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3885090,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3885090,'Bury',this)">反对(0)</a></div><span id="comment_3885090_avatar" style="display:none;">http://pic.cnblogs.com/face/711018/20161218230239.png</span>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3887965,'YrKlMtLtjMVByohRSzFi3vDa9EvWFUYo0DbCkuUjOwwkw9EZNq4UPg==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3887965,'YrKlMtLtjMVByohRSzFi3vDa9EvWFUYo0DbCkuUjOwwkw9EZNq4UPg==')">引用</a></span>
			</div>
			<a href="#3887965" class="layer">#17楼</a><a name="3887965" id="comment_anchor_3887965"></a>  <span class="comment_date">2018-01-12 20:25</span> <a id="a_comment_author_3887965" href="http://www.cnblogs.com/changfeng1800/" target="_blank">changfeng1800</a> <a href="http://msg.cnblogs.com/send/changfeng1800" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3887965" class="blog_comment_body">我的大王威武</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3887965,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3887965,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3904744,'fdNxmrIxlKZQ9HzTG/EY+nUomG0psAilfc5SGm32fbGxSJqBUHTliQ==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3904744,'fdNxmrIxlKZQ9HzTG/EY+nUomG0psAilfc5SGm32fbGxSJqBUHTliQ==')">引用</a></span>
			</div>
			<a href="#3904744" class="layer">#18楼</a><a name="3904744" id="comment_anchor_3904744"></a>  <span class="comment_date">2018-02-06 12:59</span> <a id="a_comment_author_3904744" href="http://www.cnblogs.com/ali6102/" target="_blank">ali6102</a> <a href="http://msg.cnblogs.com/send/ali6102" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3904744" class="blog_comment_body">UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个<b>字符</b></div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3904744,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3904744,'Bury',this)">反对(0)</a></div>
		</div>
	</div>

	<div class="feedbackItem">
		<div class="feedbackListSubtitle">
			<div class="feedbackManage">
				&nbsp;&nbsp;<span class="comment_actions"><a href="javascript:void(0);" onclick="return ReplyComment(3934994,'dDpLxZFwFa6xS5CInav7Vrk+H//CpWr9tyWKBcwSaOnHP3YvjMZxwA==')">回复</a><a href="javascript:void(0);" onclick="return QuoteComment(3934994,'dDpLxZFwFa6xS5CInav7Vrk+H//CpWr9tyWKBcwSaOnHP3YvjMZxwA==')">引用</a></span>
			</div>
			<a href="#3934994" class="layer">#19楼</a><a name="3934994" id="comment_anchor_3934994"></a><span id="comment-maxId" style="display:none;">3934994</span><span id="comment-maxDate" style="display:none;">2018/3/27 17:19:46</span>  <span class="comment_date">2018-03-27 17:19</span> <a id="a_comment_author_3934994" href="http://www.cnblogs.com/yiwei1000/" target="_blank">云雨枫</a> <a href="http://msg.cnblogs.com/send/%E4%BA%91%E9%9B%A8%E6%9E%AB" title="发送站内短消息" class="sendMsg2This">&nbsp;</a>
		</div>
		<div class="feedbackCon">
			<div id="comment_body_3934994" class="blog_comment_body">终于搞懂了,原来文件编码和解释器编码还不一样,太坑了。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3934994,'Digg',this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3934994,'Bury',this)">反对(0)</a></div>
		</div>
	</div>
<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
</div><!--end: forFlow -->
</div>
posted @ 2018-03-28 17:30  韦大仙  阅读(387)  评论(0)    收藏  举报