python unicode 及解码编码方式简介

python及编码原理测试

基于utf—8环境。

#coding:utf-8
unicode为通用编码。

coding:utf-8的作用是声明python解释器及str的编码方式,并不改变其他sys.getdefaultencoding()的默认编码方式。

unicode 经过encode变为 str

str 经过decode变为 unicode

u’你好’ 代表 unicode 形式的你好
utf-8 以及 gbk 等都是编码方式:
以utf-8为例:

  • unicode 经过 utf-8 编码,u’我’.encode(‘utf-8’), 得到 utf-8 的str
  • coding:gbk指定了编码方式,即该字符串为utf-8编码方式,如果需要解码到unicode,需要decode(‘utf-8’)
  • sys.setdefaultencoding(‘gbk’)代表默认解码方式为decode(‘gbk’),即在使用’我我我’.encode(‘utf-8’)时,默认省略的解码方式为decode(‘gbk’)。
  • locale.getdefaultlocale()可以查看当前系统的环境语言及编码方式,在print输出时,根据编码方式输出。在mac中是‘utf-8’,所以在encode(‘utf-8’)之后可以print完好输出,而在windows中,(我的暗影精灵是’cp936’,所以输出乱码),在mac中如果encode(‘gbk’)则输出也为乱码。
  • 而u’我我我’根据编辑器的#coding:种类进行unicode解码,所以#coding:的类别并不重要,最后都可以正确存为unicdoe方式。

各个编辑器默认方式:

  • pycharm编辑器各环境及编码方式为正常方式。
  • jupyter notebook 默认环境#coding:utf-8,修改成#coding:gbk似乎无效
  • sublimetxt3 需要设置默认编码方式,初期实验因为没有设置sublime的默认编码方式导致一直错误,设置为utf-8后,与pycharm相同。符合此条件。但是locale.getdefaultlocale()为(None,None),与其他不同,前两个都是(‘zh-cn’,’utf-8’)
  • terminal终端命令行符合此条件,完全符合。

代表性:

# coding:gbk
import sys
print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('utf-8')
#此处utf-8的作用是默认decode为(utf-8)
print sys.getdefaultencoding()
import locale
print locale.getdefaultlocale()
import chardet
print sys.getdefaultencoding()
b = '我我我我我我我无无'.decode('gbk').encode('gbk')
#此处意义在于:‘我’字符串为gbk编码,可以利用gbk解码为unicode,而如果 ‘我’.encode('gbk')则默认采用sys.getdefaultencoding(),utf-8解码,则会出现错误。
c = '我我我我'.encode('gbk')
#会出现错误,因为c为gbk编码方式,而默认decode为('utf-8'),所以需要将sys.setdefaultencoding('gbk')即可。
print b
print chardet.detect(b)
ascii
utf-8
('zh_CN', 'UTF-8')
utf-8
������������������
{'confidence': 0.99, 'language': 'Chinese', 'encoding': 'GB2312'}
#coding:utf-8
# in Ubuntu16.04 locale('en-US','UTF-8')
# 终端运行此脚本
import os
wo = '\xe6\x88\x91'
wogbk = wo.decode('utf-8').encode('gbk')
print wogbk
#乱码 
a = 'ww'.encode('gbk')
print a
#ww
k1 = os.listdir('/home/sy/finetuneVGGFACE/demoImage_crop/王光伟')[0]
print type(k1)
#类型为str
print k1
k = os.listdir('/home/sy/finetuneVGGFACE/demoImage_crop/王光伟'.decode('utf-8'))[0]
print type(k)
#类型为unicode
print k.encode('utf-8')

#print k.encode('ascii') 
#assert k.decode('utf-8') == u'王光伟'
import chardet
a = '我wowowowowow我我我我我我'
print a
chardet.detect(a)
我wowowowowow我我我我我我





{'confidence': 0.99, 'encoding': 'utf-8', 'language': ''}
a = '我wowowowowow我我我我我我'.decode('utf-8').encode('gbk')
print a
chardet.detect(a)
��wowowowowow������������





{'confidence': 0.99, 'encoding': 'GB2312', 'language': 'Chinese'}
import locale
print locale.getdefaultlocale()
('zh_CN', 'UTF-8')
a = u'你好'
b = '你好'
b = b.decode('utf-8').encode('gbk')
print a
你好
print b
���
a = u'a我我我'
a
u'a\u6211\u6211\u6211'
chardet.detect(a)
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-25-f83d6a7ce375> in <module>()
----> 1 chardet.detect(a)


/Users/eclipsycn/anaconda2/lib/python2.7/site-packages/chardet/__init__.pyc in detect(byte_str)
     32         if not isinstance(byte_str, bytes):
     33             raise TypeError('Expected object of type bytes or bytearray, got: '
---> 34                             '{0}'.format(type(byte_str)))
     35         else:
     36             byte_str = bytearray(byte_str)


TypeError: Expected object of type bytes or bytearray, got: <type 'unicode'>
# coding:utf-8
import sys
print sys.getdefaultencoding()
import chardet
a = 'uslngslkengslkfsng'.decode('utf-8').encode('utf-8')
b = '好好好好啊wefwlngsf'.decode('utf-8').encode('gbk')
print a
print b
print chardet.detect(a)
print chardet.detect(b)
ascii
uslngslkengslkfsng
�úúúð�wefwlngsf
{'confidence': 1.0, 'language': '', 'encoding': 'ascii'}
{'confidence': 0.99, 'language': 'Chinese', 'encoding': 'GB2312'}

在pycharm中,运行

# coding:gbk
import sys
print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('utf-8')
#此处utf-8的作用是默认decode为(utf-8)
print sys.getdefaultencoding()
import locale
print locale.getdefaultlocale()
import chardet
print sys.getdefaultencoding()
b = '我我我我我我我无无'.decode('gbk').encode('gbk')
#此处意义在于:‘我’字符串为gbk编码,可以利用gbk解码为unicode,而如果 ‘我’.encode('gbk')则默认采用sys.getdefaultencoding(),utf-8解码,则会出现错误。
print b
print chardet.detect(b)
ascii
utf-8
('zh_CN', 'UTF-8')
utf-8
������������������
{'confidence': 0.99, 'language': 'Chinese', 'encoding': 'GB2312'}

在Windows中,默认环境为GBK编码方式。所以有如下代码测试:

在pycharm中

#coding:utf-8
import os 
path = './测试/'.decode('utf-8')
for i in os.listdir(path):
    print i

经过测试 os.listdir()的输入参数如果是unicode编码,如u(‘./’),返回的是unicode通用编码。如果输入的是一般不带u的普通编码,如gbk(windows),utf-8(ubuntu),类似与os.listdir(‘,/’),则会返回相应环境的编码。
由于在windows中,print 为gbk编码,故转化为gbk显示。

#coding:utf-8
a ='\xce\xd2' #wo de gbk 
print a.decode('gbk')
assert a.decode('gbk').encode('utf-8') == '我'

输出 我

在windows命令行中:
全部为gbk环境下
经过测试 os.listdir()的输入参数如果是unicode编码,如u(‘./’),返回的是unicode通用编码。如果输入的是一般不带u的普通编码,如gbk(windows),utf-8(ubuntu),类似与os.listdir(‘,/’),则会返回相应环境的编码。在windows的gbk中调用。原理与上述内容编码原理相同。

>>>import os
>>>os.listdir('./测试') #error因为sys.getdefaultencoding()默认ascii编码方式
>>>a = os.listdir('./测试'.decode('gbk'))
>>>a
[u'201709\u8981\u6295']
>>>print a
'201709要投' #因为print 是gbk 环境
>>>print a.encode('gbk')
'201709要投' #与上条相同,因为上条默认gbk
>>>a.encode('gbk') == '201709要投'
True
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值