python的中文處理還是比較麻煩的,utf-8的字符串的長度是1-6個字符,一不小心就會從中截斷,出現所謂的亂碼。下面這個函數提供了,從一段utf-8編碼的字符串中,截取固定長度的字串。ord(char)將字符轉換稱整數,根據utf-8的編碼規則,確定每個utf-8的字占用幾個字符,從而避免截斷的情況。
參數:
string :utf-8字符串,如果是別的字符編碼,請先轉換成utf-8(推薦所有字符串和文件都用utf-8格式的)
length :字符數(注意不是中文字的個數)
題外話:
python的字符編碼,有幾個函數unicode(str,'charset'),str.decode('charset'),str.encode('charset')。
舉個例子,你要將gb2312轉為gbk,如下
str = unicode(str,'gb2312') #轉為unicode
str.encode('gbk') #轉為gbk
實際上,linux系統中,你可以使用iconv -f gb2312 -t gbk sourcefile > targetfile來進行轉換。
- def subString(string,length):
- if length >= len(string):
- return string
- result = ''
- i = 0
- p = 0
- while True:
- ch = ord(string[i])
- #1111110x
- if ch >= 252:
- p = p + 6
- #111110xx
- elif ch >= 248:
- p = p + 5
- #11110xxx
- elif ch >= 240:
- p = p + 4
- #1110xxxx
- elif ch >= 224:
- p = p + 3
- #110xxxxx
- elif ch >= 192:
- p = p + 2
- else:
- p = p + 1
- if p >= length:
- break;
- else:
- i = p
- return string[0:i]
后記:
后來,我發現一種更為簡單的方法
str = '中國人'
str.decode('utf-8')[0:1].encode('utf-8')
先轉換成unicode,再取子串,然后轉換成utf-8