1. 程式人生 > >python中求漢字字串長度以及預設編碼與解碼格式設定

python中求漢字字串長度以及預設編碼與解碼格式設定

print(len('你好啊'))

結果為 3

一般漢字在uicode編碼格式中,一個漢字對應長度為1

在utf-8編碼格式中,一個漢字對應長度為3

我在剛開始寫的時候,在python3環境下,列表value裡,用的是:len(value[i].decode('utf-8')) 

但執行結果錯誤,我又把utf-8去掉,還是不行,最後直接用len(value[i]),最後結果就正確了。

python2中預設的編碼格式為ASCII碼,python3中預設的是utf-8,所以不用轉碼,直接計算長度就可以

接下來說一下編碼和解碼格式:

必須將編碼註釋放在第一行或者第二行,一般來說,python檔案的前兩行要這樣寫:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

其中第一行是指定python直譯器,第二行是指定python檔案編碼方式,設定編碼方式有以下可選的方法

1. 帶等號的設定方法:

#!/usr/bin/python
# coding=<encoding name>

2. 最常見的,帶冒號的(大多數編輯器都可以正確識別的):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

3. vim的:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

設定頭部的編碼宣告有以下幾個作用:

  1. 如果程式碼中有中文註釋,就需要此宣告
  2. 比較高階的編輯器(比如我的emacs),會根據頭部宣告,將此作為程式碼檔案的格式。
  3. 程式會通過頭部宣告,解碼初始化 u”人生苦短”,這樣的unicode物件,(所以頭部宣告和程式碼的儲存格式要一致)

設定預設解碼格式

import sys   #引用sys模組進來,並不是進行sys的第一次載入  
reload(sys)  #重新載入sys  
sys.setdefaultencoding('utf8')  ##呼叫setdefaultencoding函式

這裡特別注意的是第二行的reload(sys),這個一定不能少,少了的話就不能正確執行。那麼為什麼要重新載入,而直接引用過來則不能呼叫該函式呢?因為setdefaultencoding函式在被系統呼叫後被刪除了,所以通過import引用進來時其實已經沒有了,所以必須reload一次sys模組,這樣setdefaultencoding才會為可用,才能在程式碼裡修改直譯器當前的字元編碼。

在python安裝目錄的Lib資料夾下,有一個叫site.py的檔案,在裡面可以找到main() –> setencoding()–>sys.setdefaultencoding(encoding),因為這個site.py每次啟動python直譯器時會自動載入,所以main函式每次都會被執行,setdefaultencoding函式一出來就已經被刪除了。

關於 sys.defaultencoding,這個在解碼沒有明確指明解碼方式的時候使用。比如我有如下程式碼:

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 
s = '中文'  # 注意這裡的 str 是 str 型別的,而不是 unicode 
s.encode('gb18030') 

這句程式碼將 s 重新編碼為 gb18030 的格式,即進行 unicode -> str 的轉換。因為 s 本身就是 str 型別的,因此 
Python 會自動的先將 s 解碼為 unicode ,然後再編碼成 gb18030。因為解碼是python自動進行的,我們沒有指明解碼方式,python 就會使用 sys.defaultencoding 指明的方式來解碼。很多情況下 sys.defaultencoding 是 
ANSCII,如果 s 不是這個型別就會出錯。拿上面的情況來說,我的 sys.defaultencoding 是 anscii,而 s 的編碼方式和檔案的編碼方式一致,是 utf8 的,所以出錯了:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 
0: ordinal not in range(128) 

對於這種情況,我們有兩種方法來改正錯誤:

一是明確的指示出 s 的編碼方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

s = '中文' 
s.decode('utf-8').encode('gb18030') 

二是更改 sys.defaultencoding 為檔案的編碼方式

#! /usr/bin/env python 
# -*- coding: utf-8 -*- 

import sys 
reload(sys) # Python2.5 初始化後會刪除 sys.setdefaultencoding 這個方法,我們需要重新載入 
sys.setdefaultencoding('utf-8') 

str = '中文' 
str.encode('gb18030')