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

歡迎訪問 生活随笔!

生活随笔

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

python

python查看字符编码值_Python 字符编码

發布時間:2023/12/14 python 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python查看字符编码值_Python 字符编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符串也是一種數據類型,但比較特殊的是字符串存在一個編碼問題,也就是我們怎么用計算機來表示相應的字符并存儲。在編程語言中,我們經常會處理文本編碼之間的轉化問題,因為文本可能存在不同的編碼,比如 ASCII、GBK、UTF-8 等等。

如果希望正確的處理文本,就必須了解字符的抽象概念。我們可以認為字符表示的是文本中的單個符號。更重要的是,一個字符不是一個字節。比如,"中"在文本中是一個字符,但它存儲在計算機中時卻不是一個字節。一個字符有許多表示方法,不同的表示方法會使用不同的字節數,這就是所謂的編碼。字符就是文本中最小的單元。

由于計算機是美國人發明的,因此,最早只有 127 個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為 ASCII 編碼。但是計算機被廣泛應用之后,ASCII 編碼已經不足以表示世界上的各種語言,于是后來便出現了 Unicode 編碼。

Unicode 是一種編碼規范, 用來統一表示世界上的各種語言。Unicode 只是規定如何編碼,并沒有規定如何傳輸和保存等等,因此 Unicode 編碼有不同的實現方式,比如:UTF-8、UTF-16 。UTF-8 編碼把一個 Unicode 字符根據不同的數字大小編碼成 1-6 個字節,常用的英文字母被編碼成 1 個字節,漢字通常是 3 個字節,只有很生僻的字符才會被編碼成 4-6 個字節。Unicode 以大家都認可的方式定義了一系列的字符,可以將其理解成一個字符數據庫,每個字符都與唯一的數字關聯,稱為 code point。這樣,英文大寫字母 A 的 codepoint 是 U+0041,而歐元符號的 codepoint 是 U+20A0。一個文本字符串就是一系列的 code point,表示字符串中每個字符元素。

Python 由荷蘭人 Guido van Rossum 于 1989 年發明,第一個公開發行版發行于 1991 年。Guido 在設計之初并沒有關心編碼問題(當時他也不知道后來會出現編碼問題), 而且 Python 的誕生比 Unicode 標準發布的時間要早,因此 Python 默認編碼在 Python3 之前是 ASCII。查看 Python 的默認編碼:

>>> import sys

>>> sys.getdefaultencoding()

'ascii'

這么默認編碼有什么用呢?如果你在 Python 中進行編碼和解碼的時候,不指定編碼方式,那么 Python 就會使用 defaultencoding。

字符串在 Python 內部的表示是 Unicode 編碼, 在 Python 內部使用兩個字節來存儲一個 Unicode。也就是 Python 在內存中統一使用 Unicode 編碼存儲字符數據,當需要保存到硬盤或者需要傳輸的時候,就轉換為其他編碼,比如 UTF-8。

在 Python2 中,字符串的類型有兩種,即 str 和 unicode,他們都是 basestring 的子類。unicode 表示 Unicode 字符串(文本字符串),str 表示字節字符串(二進制數據),由 unicode 經過編碼后的字節組成。也就是說:

str 存儲的是已經編碼后的字節序列,輸出時看到每個字節用 16 進制表示,以\x開頭。每個漢字會占用3個字節的長度。

unicode 是“字符”串,存儲的是編碼前的字符,輸出時看到字符以\u開頭。每個漢字占用一個長度。定義一個 Unicode 對象時,以 u 開頭。

在 Python 中 Unicode 被視為是一種中間碼,如果要在不同的編碼間進行轉化,通常是先將字符串解碼(decode)成 Unicode 編碼,再從 Unicode 編碼(encode)成另一種編碼:

decode: 的作用是將其他編碼的字符串轉換成 Unicode 編碼,例如: name.decode(“GB2312”),表示將 GB2312 編碼的字符串 name 轉換成 Unicode 編碼

encode: 的作用是將 Unicode 編碼轉換成其他編碼的字符串例如,例如: name.encode(”GB2312“),表示 Unicode 編碼的字符串 name 轉換成 GB2312 編碼

我們會在很多 Python 的源碼文件的頭部看到如下的聲明:

# coding: utf-8

這表示聲明源代碼中的文本編碼為 UTF-8,也就是告訴 Python 解釋器將文件中的文本視為 UTF-8 編碼的字符串,因此聲明的編碼應該與文件的編碼保持一致。在代碼中我們通常會處理一些其他來源的文本,比如網絡,它們的編碼不一定也是 UTF-8 的,因此就要進行編碼轉換。

Python 試圖在字節串和字符串之間以不為人所察覺的方式進行轉化。在不同的轉換中,在條件允許的情況下,Python 會試圖在字節串和 unicode 字符串直接進行轉換。例如將字節串和 unicode 字節串連接到一起時。但是不使用 encoding 就在不同類型之間進行轉換是沒有意義的。所以 Python 依賴一個 默認編碼,該編碼由 sys.setdefaultencoding() 指定。在大多數平臺上,默認的是 ASCII 編碼。但對于所有轉換,使用這種編碼幾乎都是錯誤的。如果不手動指定編碼就調用 str() 或 unicode() ,或是函數以字符串作為參數,但傳遞的是其他類型的參數時,都會使用這個默認編碼。這就是很多時候出現 UnicodeEncodeError 和 UnicodeDecodeError 錯誤的原因,也就是 字符串對象互相轉化時沒有指定字符編碼。

例如,如果對 unicode 和 str 類型通過 + 拼接時,輸出結果是 unicode 類型,相當于先將 str 類型的字符串通過 decode() 方法解碼成 unicode 再拼接。此時如果解碼時沒有明確指明編碼類型,可能會出現錯誤。

解決這個問題的一個辦法是,調用 sys.setdefaultencoding() 將默認的編碼設置為真正會用到的編碼。但這樣僅僅是將問題隱藏起來,雖然這樣剛開始能解決一些文本處理問題。但缺乏實際可行性,因為許多應用,特別是網絡應用,在不同的地方會使用不同的文本編碼。

要注意的一點是,對 Unicode 進行編碼和對 str 進行編碼都是錯誤的。即不要對 str 使用 encode,不要對 unicode 使用 decode(事實上可以對 str 進行 encode 的,但不建議)。

下面是一些處理 Python 中字符編碼的建議:

所有文本字符串都應該是 unicode 類型,而不是 str 類型。

若要將字節串解碼成字符串,需要使用正確的解碼,即 var.decode(encoding),如: var.decode('utf-8');將文本字符串編碼成字節,使用 var.encode(encoding)。

永遠不要對 unicode 字符串使用 str() ,也不要在不指定編碼的情況下就對字節串使用 unicode() 。

當應用從外部讀取數據時,應將其視為字節串,即 str 類型的,接著調用 .decode() 將其解釋成文本。同樣,在將文本發送到外部時,總是對文本調用 .encode()。

對標準流進行操作時,可以改變環境變量 PYTHONIOENCODING 的值來設置標準流的默認編碼, sys.stdin.encoding 和 sys.stdout.encoding 的值為期望的編碼。

以上內容的討論都僅限于 Python2,在 Python3 中已經修復了這些問題,可以正確的處理 unicode 和字符串。

參考資料:

總結

以上是生活随笔為你收集整理的python查看字符编码值_Python 字符编码的全部內容,希望文章能夠幫你解決所遇到的問題。

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