自适应网站的优劣,企业管理,广西哪家公司做网站的,一等一网站在py2中#xff0c;分为两类#xff0c;str和unicode 而在py3中#xff0c;分为两类#xff0c;byte和str py2中的str等同于py3中的byte 首先明确一点#xff0c;我们编辑好一段文本#xff0c;python并不知道我们的文本是以什么格式编码的。如果是纯英文字符还好说… 在py2中分为两类str和unicode 而在py3中分为两类byte和str py2中的str等同于py3中的byte 首先明确一点我们编辑好一段文本python并不知道我们的文本是以什么格式编码的。如果是纯英文字符还好说如果这段代码中有汉字则会报错了。 所以我们要显式的告诉python此文本的编码格式。 为了说明问题首先将以下测试代码以utf-8格式编辑保存 1 # -*- coding:utf-8 -*- #告知python我这个文件里的文本是用utf-8编码的如果不加而文本中又包含汉字没运行前就会报错2 import time3 4 a 严5 print a#乱码a是utf-8格式而windows控制台使用gbk进行解码6 b unicode(a,utf-8).encode(gbk)#将严先解码为unicode格式在编码为gbk格式7 print b#正确显示严8 c a.decode(utf-8)#等效于c unicode(严,utf-8)亦等效于c u严 c是unicode格式的9 print type(a),type(b),type(c)#a,b都是str类c是unicode类
10 print c
11 time.sleep(4) 但是还有一个疑问既然windows控制台使用gbk解码为什么utf8的a是乱码而unicode的b就不会是乱码呢 因为Python在向控制台输出unicode对象的时候会自动根据输出环境的编码进行转换,这样就能正确解码了。但如果输出的不是unicode对象而是普通字符串则控制台并不会参考我们声明的编码格式进行str到unicode的转换而是直接会按照终端编码去解码acmd编码为gbk,linux系统默认编码为utf8当然会出错 事实上最简单的str转unicode的方式是在字符串前加u,如u严python会根据第一行标明的coding来认定‘严’的格式然后转换为unicode格式 2.encode与decode 首先明确一点,python认定unicode为指定编码。从其他编码转为unicode叫做解码从unicode转为str叫做编码, 而任何两种字符编码之间如果想完成转化必须要通过unicode这个桥梁先把它抓化成unicode对象在转为另一个编码 encode是将unicode类对象编码成其他格式所以正规调用为unicode.encode() decode是将str类对象解码成unicode类对象所以正规调用是str.decode() 但是Python允许str.encode(),也允许unicode.decode()。 这里涉及隐式类型转化的问题 str.encode()实际上就等价于str.decode(sys.getdefaultencoding()).encode().而sys.defaultencoding如果不改的话默认是ascii所以这里的str不能是中文字符。 unicode.decode()会先将unicode转化成str然后再执行decode() 函数decode()有默认参数默认参数为sys.getdefaultencoding()。 3关于sys.getdefaultencoding() 这是sys模块的内置方法该方法返回python的默认编码。 以下为转载http://liguangming.com/how-to-use-utf-8-with-python python 中获得系统默认编码为 import sys
print sys.getdefaultencoding() 而修改系统默认编码应写为 import sys
reload(sys)
sys.setdefaultencoding(UTF-8) 为什么需要一个看似多余的reload(sys)呢 因为python初始化后会删除 sys.setdefaultencoding 这个方法我们需要重新载入 先看下python的模块加载过程: # python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/local/lib/python2.6/site.pyc matches /usr/local/lib/python2.6/site.py
import site # precompiled from /usr/local/lib/python2.6/site.pyc
.... Python运行的时候首先加载了site.py在site.py文件里有这么一段代码: if hasattr(sys, setdefaultencoding):del sys.setdefaultencoding在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码. 4 判断是否为unicode/str的方法 [python] view plain copy isinstance(u‘中文‘, unicode) True isinstance(‘中文‘, unicode) False isinstance(‘中文‘, str) True isinstance(u‘中文‘, str) False 5py3中的bytes和unicode 如果说在Python2中第一行的声明可以和文件实际采用的编码格式不相一致只是这样就不能用u汉字的形式将str转换为unicode了但是仍然可以用unicode方法或decode方法转换。比如我在python文件中声明codingutf-8,而我编辑这个文件的时候实际采用的编码是gbk。所以在python2中第一行声明conding的作用好像也仅仅局限于可以用u汉字的形式将str转换为unicode了。声明错了也无大碍。当然最好要保持一致。 但是在python3中第一行声明的coding就作用大了必须声明正确。直接用代码加以说明吧代码来自大神crifanhttps://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str/ python_3.x_str_to_bytes.py 1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 4 -------------------------------------------------------------------------------5 Function:6 【整理】Python中字符编码的总结和对比Python 2.x的str和unicode vs Python 3.x的bytes和str7 http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str8 9 Author: Crifan
10 Verison: 2012-11-29
11 -------------------------------------------------------------------------------
12
13
14 def python3xStrToBytes():
15 Demo Python 3.x (unicode) str to bytes
16
17
18 zhcnUnicode 1.此处的Python 3.x中默认字符串的写法就已经是unicode类型的字符串了。2.当然还是有一点前提的那就是你在(1)此处python文件所指定的编码类型(2)要和你当前python文件实际所采用的编码类型要匹配和一致即此处两者均是UTF-8所以Python解析器才能正确的将我们此处所输入的UTF-8的中文字符正确地解码为对应的Unicode字符串的3.接下来将要演示的是打印对于的此处字符的类型然后再直接输出显示到windows的GBK编码的cmd中;
19 print(type(zhcnUnicode),type(zhcnUnicode)); #type(zhcnUnicode) class str
20 zhcnGbkBytes zhcnUnicode.encode(GBK);
21 print(You should see these zh-CN bytes in windows cmd normally, which begin with b preffix: zhcnGbkBytes%s%(zhcnGbkBytes)); #You should see these zh-CN bytes in windows cmd normally, which begin with b preffix: zhcnGbkBytesb1.\xb4\xcb\xb4\xa6\xb5 ...... \xc2\xeb\xb5\xc4cmd\xd6\xd0
22
23 ###############################################################################
24 if __name____main__:
25 python3xStrToBytes(); python_3.x_bytes_to_str.py 1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3 4 -------------------------------------------------------------------------------5 Function:6 【整理】Python中字符编码的总结和对比Python 2.x的str和unicode vs Python 3.x的bytes和str7 http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str8 9 Author: Crifan
10 Verison: 2012-11-29
11 -------------------------------------------------------------------------------
12
13
14 def python3xBytesToStr():
15 Demo Python 3.x bytes to (unicode) str
16
17
18 #此处的bytes只能接受ASCII字符
19 #想要输入非ASCII的字符则只能通过\xYY的十六进制方式输入其中YY为对应的16进制的值
20 #此处我是已经在别处通过把对应的中文:
21 #1.Python 3.x中给字符串前面添加字母b表示是bytes的字符串2.此处之所以可以实现接下来的Python解析器可以正确的将bytes解码为Unicode的str那是因为(1)此处python文件所指定的编码类型(2)要和你当前python文件实际所采用的编码类型是一致的都是UTF-83.接下来将要演示的是将此bytes字符串解码为Unicode的str然后在此处的终端windows的默认编码为GBK的cmd中显示出来;
22 #解析为UTF-8的bytes了所以下面你看到的是解析后的一堆bytes
23
24 zhcnBytes b1.\xe6\xad\xa4\xe5\xa4\x84\xe7\x9a\x84\xef\xbc\x8cPython 3.x\xe4\xb8\xad\xef\xbc\x8c\xe9\xbb\x98\xe8\xae\xa4\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe7\x9a\x84\xe5\x86\x99\xe6\xb3\x95\xef\xbc\x8c\xe5\xb0\xb1\xe5\xb7\xb2\xe7\xbb\x8f\xe6\x98\xafunicode\xe7\xb1\xbb\xe5\x9e\x8b\xe7\x9a\x84\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe4\xba\x86\xe3\x80\x822.\xe5\xbd\x93\xe7\x84\xb6\xef\xbc\x8c\xe8\xbf\x98\xe6\x98\xaf\xe6\x9c\x89\xe4\xb8\x80\xe7\x82\xb9\xe5\x89\x8d\xe6\x8f\x90\xe7\x9a\x84\xef\xbc\x8c\xe9\x82\xa3\xe5\xb0\xb1\xe6\x98\xaf\xef\xbc\x8c\xe4\xbd\xa0\xe5\x9c\xa8(1)\xe6\xad\xa4\xe5\xa4\x84python\xe6\x96\x87\xe4\xbb\xb6\xe6\x89\x80\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\xe7\xb1\xbb\xe5\x9e\x8b(2)\xe8\xa6\x81\xe5\x92\x8c\xe4\xbd\xa0\xe5\xbd\x93\xe5\x89\x8dpython\xe6\x96\x87\xe4\xbb\xb6\xe5\xae\x9e\xe9\x99\x85\xe6\x89\x80\xe9\x87\x87\xe7\x94\xa8\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\xe7\xb1\xbb\xe5\x9e\x8b\xef\xbc\x8c\xe8\xa6\x81\xe5\x8c\xb9\xe9\x85\x8d\xe5\x92\x8c\xe4\xb8\x80\xe8\x87\xb4\xef\xbc\x8c\xe5\x8d\xb3\xe6\xad\xa4\xe5\xa4\x84\xef\xbc\x8c\xe4\xb8\xa4\xe8\x80\x85\xe5\x9d\x87\xe6\x98\xafUTF-8\xef\xbc\x8c\xe6\x89\x80\xe4\xbb\xa5\xef\xbc\x8cPython\xe8\xa7\xa3\xe6\x9e\x90\xe5\x99\xa8\xef\xbc\x8c\xe6\x89\x8d\xe8\x83\xbd\xe6\xad\xa3\xe7\xa1\xae\xe7\x9a\x84\xe5\xb0\x86\xe6\x88\x91\xe4\xbb\xac\xe6\xad\xa4\xe5\xa4\x84\xe6\x89\x80\xe8\xbe\x93\xe5\x85\xa5\xe7\x9a\x84UTF-8\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xef\xbc\x8c\xe6\xad\xa3\xe7\xa1\xae\xe5\x9c\xb0\xe8\xa7\xa3\xe7\xa0\x81\xe4\xb8\xba\xe5\xaf\xb9\xe5\xba\x94\xe7\x9a\x84Unicode\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe7\x9a\x84\xef\xbc\x9b3.\xe6\x8e\xa5\xe4\xb8\x8b\xe6\x9d\xa5\xe5\xb0\x86\xe8\xa6\x81\xe6\xbc\x94\xe7\xa4\xba\xe7\x9a\x84\xe6\x98\xaf\xef\xbc\x8c\xe6\x89\x93\xe5\x8d\xb0\xe5\xaf\xb9\xe4\xba\x8e\xe7\x9a\x84\xe6\xad\xa4\xe5\xa4\x84\xe5\xad\x97\xe7\xac\xa6\xe7\x9a\x84\xe7\xb1\xbb\xe5\x9e\x8b\xef\xbc\x9b\xe7\x84\xb6\xe5\x90\x8e\xe5\x86\x8d\xe7\x9b\xb4\xe6\x8e\xa5\xe8\xbe\x93\xe5\x87\xba\xe6\x98\xbe\xe7\xa4\xba\xe5\x88\xb0windows\xe7\x9a\x84GBK\xe7\xbc\x96\xe7\xa0\x81\xe7\x9a\x84cmd\xe4\xb8\xad;
25 print(type(zhcnBytes),type(zhcnBytes)); #type(zhcnBytes) class bytes
26 zhcnUnicodeStr zhcnBytes.decode(UTF-8);
27 print(You should see these zh-CN unicode str in windows cmd normally: zhcnUnicodeStr%s%(zhcnUnicodeStr)); #You should see these zh-CN unicode str in windows cmd normally: zhcnUnicodeStr1.此处的Python 3.x中 ...... 然后再直接输出显示到windows的GBK编码的cmd中
28
29 ###############################################################################
30 if __name____main__:
31 python3xBytesToStr(); 【总结】 如果你正确声明指定了文件编码的话那么python 3.x中对于你所写的字符串默认会自动解析并存储为Unicode的(这里的存储指的是代码从文件载入到内存中)所有后期的各种处理包括在cmd中的输出都会很好的自动转换为对应的编码并输出显示的比如输出到cmd中会自动转换为cmd的GBK编码得以正确显示的 #-*-coding:utf8;-*-
#py2
a新
b\xe6\x96\xb0
print ab#True#a在百分之99的情况下都与b相同只有一种情况下不同cu新du\xe6\x96\xb0#报错 #-*-coding:utf8;-*-
#py2
au\u4e2d
bu中
print ab#true #-*-coding:utf8;-*-
#py3a\u4e2d
b中
print (ab)#true 转载于:https://www.cnblogs.com/saolv/p/8158159.html