發表於2023年 05月 29日
python2.7中的字串編碼問題的關鍵是:
str其實並不是字串而是位元組串(八位二進位制資料串),而unicode字串物件才是真正的字串。
所以只要弄清楚str位元組串中儲存的到底是什麼編碼格式的二進位制資料即可解決編碼問題。
1,原始碼檔案(.py.pyw)編碼問題。
只要保證檔案編碼為無bom的utf-8格式,然後在原始碼的第一行加上
# -*- coding: utf-8 -*-
就可以保證正常讀取utf-8編碼編碼的資料了,用utf-8格式解碼其中的字串就可以得到unicode字串物件了。
# -*- coding: utf-8 -*-
print type('中文'.decode('utf-8'))
2,讀取文字檔案或者獲取網上的字元資料的編碼問題。
其實和讀取源**檔案時一樣,只是源**檔案第一行說明了編碼格式而這時沒有,需要自行判斷。
檔案編碼格式可以通過notepad2記事本檢視確認,網路文字可以根據網頁head中的資訊確認編碼格式,然後相應處理即可。
用二進位制方式(wb,rb)讀取檔案資料(可以避免一些字元方式(w,r)時python2預設以ascii編碼格式讀取檔案字元引起的問題,例如不同平台的換行符問題),然後根據實際編碼格式解碼得到unicode字串物件(儲存檔案一律預設使用utf-8編碼格式)。
# -*- coding: utf-8 -*-
with open('1.txt','wb')as f:
f.write(u'中文'.encode('utf8'))
with open('1.txt','rb')as f:
print type(f.read().decode('utf8'))
網路文字讀取推薦用requests庫,然後根據實際編碼格式解碼得到unicode字串物件。
# -*- coding: utf-8 -*-
import requests
response = requests.get('')
response.encoding = 'utf8'#'gbk'等等
print type(response.text)
3,控制台輸出的編碼問題。
輸出unicode字串物件就好了,它會輸出對應系統平台預設編碼的字串資料
例如windows的cmd視窗下執行以下**程式
# -*- coding: utf-8 -*-
print 'abc中文'#utf-8編碼的字串資料
print u'abc中文'
會有輸出:
abc涓枃
abc中文
4,強調一下,unicode字串物件才是真正的字串!
# -*- coding: utf-8 -*-
print len('abc中文')#str,9
print 'abc中文'[:-1]#輸出的最後乙個字元是亂碼
print len(u'abc中文')#unicode字串物件,5
print u'abc中文'[:-1]#輸出abc中
得到unicode字串物件方法
# -*- coding: utf-8 -*-
print u'abc中文'#定義unicode字串物件
print 'abc中文'.decode('utf-8')#解碼獲取unicode字串物件
print 'abc中文', 'utf-8')#用unicode()方法獲取unicode字串物件
最後總結一下,
讀取到位元組串資料後根據實際編碼格式解碼(decode)成unicode字串物件,使用unicode物件處理字串,輸出到控制台時用unicode字串物件,儲存資料到檔案時將字串編碼(encode)成utf-8編碼格式位元組串資料。
更精簡的:
讀寫都是用的八位二進位制位元組串資料,通過編譯碼與unicode字串物件相互轉換,程式中盡量使用unicode字串物件。
python2的字串編碼的坑大概就這些了,還是會繼續使用python2,因為用print
不想加括號╮(╯_╰)╭
Python2字串編譯碼問題
在python2中有兩種型別的字串 str和unicode。二者的轉換如下 unicode字串通過encode函式轉換為str字串,稱為編碼 str字串通過decode函式轉化為unicode字串,稱為解碼.下面以print列印為例進行說明 當字串為str型別時,作業系統直接將其交給終端進行顯示 當...
python 2 字串和元組
一 字串 1.建立 單引號,雙引號,三引號 轉義字元 n,t 2.特性 索引 切片 s start stop step start預設值為0,stop預設值為字串長度,step預設值為1,步長 例如 s 1 4 2 s 1 s 4 s 1 連線操作 a b 重複操作 2 a aa 成員操作符 某成員...
Python2和3字元編碼的區別
啟動python直譯器 相當於文字編輯器 開啟檔案,顯示這個字元並檢查語法 涉及字元編碼,a 1只是乙個很普通的字元 解釋字元 涉及字元編碼,再去記憶體空間 生成乙個a 1的變數 python2用的是ascii,python3預設是utf8讀取字元 coding gbk會告訴python3直譯器用g...