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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章