python unicode 及解码编码方式简介
2017-12-19 15:43
369 查看
python及编码原理测试
基于utf—8环境。
#coding:utf-8unicode为通用编码。
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解码为 4000 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
相关文章推荐
- python编码转换,列表编码转换,编码检测,pycharm编写python乱码,文件中以unicode编码方式转成中文
- python3中编码与解码之Unicode与bytes
- Python 中的编码转换 编码方案 中文解码 gbk , utf ,unicode
- Python 有关unicode,gbk,cp2312,utf8的解码和编码
- Python 和 VBScript 对文件编码-解码的方式 (Hex, Base64) 的疑问
- python 2.x将raw_input()方式输入的字符串转换为unicode编码
- python中json格式数据输出实现方式(无unicode编码输出形式)
- python编码解码unicode
- python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode 分类: python
- 有关 Python 2 和 Sublime Text 中文 Unicode 编码问题的分析与理解
- Unicode 编码中文 + 未编码中文符号 转换成UTF-8 中文 python实现
- GET方式的中文编码与解码
- 关于python的str和unicode以及编码的问题
- Python--编码解码
- python编码及文件编ASCII,Unicode和UTF-8相关知识
- RFID:通信系统中为什么要进行编码和解码?常见的编码方式有哪些?
- 7-1 通信系统中为什么要进行编码和解码?常见的编码方式有哪些?
- python_编码_解码
- python中文utf8编码后是占3个字符,unicode汉字为2字节
- python 编码 乱码问题 ascii unicode utf-8