日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python2编码问题解决了吗_Python2编码问题

發布時間:2023/12/20 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python2编码问题解决了吗_Python2编码问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

以下內容說的都是 python 2.x 版本

簡介

基本概念

Python “幫”你做的事情

推薦姿勢

1、基本概念

我們看到的輸入輸出都是‘字符’(characters),計算機(程序)并不能直接處理,需要轉化成字節數據(bytes),因為程序只能處理 bytes 數據。

例如:文件、網絡傳輸等,處理的都是 bytes 數據——二進制數字。

1.1 ASCII / Unicode

孤立的 byte 是毫無意義的,所以我們來賦予他們含義。就引入‘字符集’的概念,‘字符集’就是一個碼位(code point)對應的一個字符的表。

該表用于賦予 byte 意義。還需要知道一個點:因為 ASCII 字符集支持的字符太少,不能表示各個國家語言中的字符。所以就發明了

Unicode ——萬國碼,該字符集包含了你能用到的所有的字符。

1.2 Encode / Decode

在 python 中字符串分為兩個對象:str 和 unicode

str: a sequence of bytes

unicode:a sequence of code point(碼位——字符集中的數字)

unicode_obj.encode() ——> bytes ‘編碼’(encode)

bytes_obj.decode() ——> unicode ‘解碼’(decode)

UTF-8 是最流行的一種對 Unicode 進行傳播和存儲的編碼方式。所以,多用它作為編碼方式。

s = 'hello' # str

u = u'你好' # unicode

back_to_bytes = u.encode('utf-8')

back_to_utf8 = back_to_bytes.decode('utf-8') # 或 unicode(s, 'utf-8')

1.3 聲明編碼

正如前面所說的,計算機只能操作 bytes,所以 Python 在編譯原文件的時候,會先把源文件進行編碼,默認以‘ASCII’進行編碼。這就是為什么如果源文件中帶有‘中文’,需要在源文件的起始行聲明編碼方式。

完成編碼后,源碼中的所有字符,都變成了 bytes 計算機就可以進行編譯和處理了。編譯過程:

讀取文件

不同的文件,根據其聲明的編碼去解析為Unicode

轉換為UTF-8字符串

針對UTF-8字符串,去分詞

編譯,創建Unicode對象(Python解釋器處理)

根據這個過程,在自己的代碼中也應該按照這個邏輯處理,意思是:

接收外部數據時,統一轉化為Unicode

代碼內部處理的都是Unicode

輸出時統一轉化為UTF-8(網絡數據傳輸、文本輸出)

1.4 小結

程序中所有的輸入和輸出均為 byte

世界上的文本需要比 256 更多的符號來表現(ASCII是不夠的)

你的程序必須能夠處理 byte 和 unicode

byte 流中不會包含編碼信息(編碼信息會在:文件的開頭、協議中等地方聲明)Content-Type:text/html; charset=UTF-8

指明的編碼有可能是錯誤的(出現亂碼)

2、python “幫”你做的事情

在 python 中處理編碼問題,會出現很多問題,這里就不一一列舉。

這些問題大都是使用了不匹配的編碼方式進行解碼、編碼造成的。而 python 為了語法更加簡介,在一些內置方法中,使用了一些隱性轉換。這種隱形的轉換帶了的便捷的同時也會帶來一些非預期的錯誤。下面就一一道來。

2.1 a = "abc" + u"bcd"

a = "abc" + u"bcd",Python 會如此轉換 "abc".decode(sys.getdefaultencoding()) 然后將兩個 Unicode 字符合并。

2.2 兩個內建方法str()和unicode(),

str:something.encode(sys.getdefaultencoding())

unicode:something.decode(sys.getdefaultencoding())

sys.getdefaultencoding()默認為:ASCII,這就是為什么str(u'中文')和unicode('中文')分別會報錯:UnicodeEncodeError和UnicodeDecodeError。因為ASCII編碼方式,編碼/解碼不了中文(支持的字符有限)。

2.3 print函數

print函數,會對輸出的內容進行編碼,這是因為:所謂的輸出,也是從一個程序到另外一個程序。程序之間的交互都是都是傳遞 bytes。比方說print,就是把數據傳遞給 終端 ,終端也是個程序,所以print函數就把需要輸出的內容編碼成了 bytes,采用那種編碼方式,就是

由sys.stdout.encoding參數決定的。

在交互環境下(python、ipython)輸入的數據的編碼則由sys.stdin.encoding參數決定。參考:What does python print() function actually do?

2.4 默認編碼方式

python 的默認編發方式為 ASCII。

如何改變python的默認編碼方式?:

import sys

# sys.setdefaultencoding() does not exist, here!

reload(sys) # Reload does the trick!

sys.setdefaultencoding('UTF8')

為什么要重載sys模塊?

因為如果在編譯.py文件的之前,改變默認編碼,會影響Python的編譯。

當編譯完,再重載sys模塊,它就是變成了第三方模塊,可以隨便更改,不回影響編譯。setdefaultencoding()函數才可以調用。參考:Changing default encoding of Python?

3、推薦姿勢

本片文章沒有列舉出常見的異常,因為如果看懂了上面所有的解釋。再按照下面的姿勢使用,那么 python2 中的編碼問題,因該就不會再困擾你了。

Unicode 三明治:盡可能的讓你程序處理的文本都為 Unicode 。如下圖:

了解你的字符串。你應該知道你的程序中,哪些是 unicode, 哪些是 byte,對于這些 byte 串。你應該知道,他們的編碼是什么。(詳情見上述小結第 4 條)

測試 Unicode 支持。使用一些奇怪的符號來測試你是否已經做到了以上幾點。(測試看看你的程序是否支持中文)

參考

本文同步分享在 博客"削微寒的程序員之路"(CNBlog)。

如有侵權,請聯系 support@oschina.cn 刪除。

本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

總結

以上是生活随笔為你收集整理的python2编码问题解决了吗_Python2编码问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。