亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python2中的中文亂碼

 更新時間:2024年06月24日 09:50:28   作者:冰美式QAQ  
這篇文章主要介紹了python2中的中文亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

python2中文亂碼問題

python2中的中文亂碼情況,本文將從一下四種情況進行展開。

下面兩句話是本文的重點,文中的內容都是圍繞下面兩句話展開的

  • 1.亂碼的本質是字符的編碼格式顯示字符的環(huán)境編碼格式不一致引起的。這句話告訴我們要解決亂碼問題,我們需要知道兩個信息,一個是字符本身是什么編碼,另一個就是顯示字符的環(huán)境編碼是什么,兩者必須一致,才能顯示出正確的內容。
  • 2.在python中,對于任何Unicode類型編碼的字符,打印時會自動根據(jù)環(huán)境編碼轉為特定編碼后再顯示。

接下來,看看字符在python代碼中是如何被編碼的。在不同的python版本中,字符編碼的方式不一樣。本文主要說的是python2版本。

亂碼情況1

python2默認使用ASCII來編碼代碼的,如果代碼中出現(xiàn)中文,那么就必須在py文件的開頭注明支持中文的編碼格式,如果沒有聲明,python2就會使用默認的ASCII編碼來識別中文,就會報錯。

s = "中文"

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py  File "E:/PycharmProjects/LEDdisplay2/1.py", line 1SyntaxError: Non-ASCII character '\xe4' in file E:/PycharmProjects/LEDdisplay2/1.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for detailsProcess finished with exit code 1

上述報錯翻譯過來就是,在1.py文件的第一行有非ASCII字符“\e4”,而且沒有聲明編碼。

如果我們設置編輯器pycharm此時的環(huán)境編碼是utf-8的話,用軟件查看1.py文件的十六進制,可以看到“中文”存儲的是\xe4\xb8\xad\xe6\x96\x87。

(utf-8存儲文件一個字符需要三個字節(jié)表示,可以看到“中文”兩個字符是六個字節(jié))

使用nodepad++查看十六進制

python2默認編碼格式ASCII編碼是不認識“\xe4”的,無法識別“中文”,所以會報錯。

所以,需要在py文件的開頭加上 # encoding:utf-8 聲明腳本的編碼方式,則python就可以識別代碼中的漢字字符串,并按照聲明的字符編碼格式來進行編碼。

補充:

  • 代碼查看python環(huán)境的默認編碼
  • 代碼查看字符串的十六進制
# encoding:utf-8
import sys

s = "中文"
print(sys.getdefaultencoding())
print (repr(s))

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
ascii
'\xe4\xb8\xad\xe6\x96\x87'

Process finished with exit code 0

亂碼情況2

如果我們在py文件開頭聲明腳本的編碼格式為utf-8,設置編輯器pycharm的環(huán)境編碼為GBK,那么,當我們打印中文時,會出現(xiàn)什么情況呢?

答:還是亂碼

# coding=utf-8s = "中文"print(s)

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
涓枃

Process finished with exit code 0

pycharm編碼設置:

原因是,上述代碼中s變量的編碼是utf-8的,而我們運行腳本的編輯器pycharm設置的環(huán)境編碼卻是GBK,兩者編碼方式不一致,所以必定會出現(xiàn)亂碼。

解決方法有以下幾種:

(這幾種方法是互斥的,目的是為了保證文件開頭聲明的編碼格式和pycharm編輯器設置的環(huán)境編碼格式一致)

1.可以修改編輯器pycharm的環(huán)境編碼為UTF-8

2.可以修改py文件開頭聲明腳本的編碼方式為GBK

3.在變量s前加一個u,將其強制轉換為Unicode編碼(前面已經說過了,對于Unicode編碼的字符,python打印時會自動根據(jù)環(huán)境編碼轉為特定編碼后再顯示)

4.通過decode和encode函數(shù)。使用decode方法可以將字符串按照指定的格式解碼成Unicode,需要注意的是,我們對所有的非Unicode類型的字符只能進行decode操作,不能進行encode操作,對Unicode類型的字符只能進行encode操作,不能進行decode操作。

# encoding:utf-8
s = "中文"
y1 = s.decode("utf-8") # s.decode("utf-8")這句話跟u“中文”效果是等價的
y2 = s.decode("utf-8").encode("gbk")
print(y1)
print(y2)

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
中文
中文

Process finished with exit code 0

注意:encode和decode的時候都是需要指定編碼的。

在 Python 中編碼是可以互相轉換的,但是不同編碼之間不能直接轉換,需要通過Unicode字符集中間過渡下。比如從utf-8轉換為gbk,需要先將utf-8格式解碼成Unicode,再編碼成gbk格式。

  • encode的正常使用:對Unicode類型進行encode,得到字節(jié)串str類型。也即是Unicode-> encode(根據(jù)指定編碼) -> str。
  • decode的正常使用:對str類型進行decode,得到Unicode類型。也即是str -> decode(根據(jù)指定編碼) -> Unicode。
  • encode的不正常使用:對str類型進行encode,因為encode需要的是Unicode類型,這個時候python會用默認編碼decode成Unicode類型,再用你給出編碼進行encode。(注意這里默認編碼不是開頭的encoding,而是ASCII編碼)
  • decode的不正常使用:對Unicode類型進行decode,python會用默認的系統(tǒng)編碼encode成str類型,再用你給出的編碼進行decode。

另外,需要注意的是,用什么字符編碼對Unicode進行編碼(編碼為str類型),就要用對應的字符編碼對str類型進行解碼(解碼為Unicode類型)

舉個不正常使用的例子:

# encoding:utf-8
import sys

s = "中文"
print(sys.getdefaultencoding())
y3 = s.encode("utf-8")
print(y3)

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
ascii
Traceback (most recent call last):
  File "E:/PycharmProjects/LEDdisplay2/1.py", line 5, in <module>
    y3 = s.encode("utf-8")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

Process finished with exit code 1

上面的代碼可以看出,python2的默認編碼是ASCII編碼,直接對str類型的變量s進行encode時,python會使用默認編碼ASCII碼將變量s先deconde成Unicode,而文件開頭已經聲明代碼用utf-8編碼,所以會報ASCII碼無法decode字節(jié)“0xe4”,而“0xe4”是utf-8編碼存儲變量s=“中文”的第一個字節(jié)的十六進制表示。

亂碼情況3

將下面代碼文件(存儲時選擇utf-8編碼)直接在命令行里面運行,又會發(fā)生什么問題呢?

# encoding:gbk
s = "中文"
y1 = s.decode("gbk") #s.decode("gbk")這句話跟u“中文”效果是等價的
y2 = s.decode("gbk").encode("utf-8")
print(y1)
print(y2)

缺圖,

y1正常顯示中文了,y2卻出現(xiàn)了亂碼。

這次出現(xiàn)亂碼的原因又是什么呢?

windows命令行的環(huán)境編碼是GBK格式,y1經過decode后是Unicode碼,前面提到對于任何Unicode類型編碼的字符,打印時python會自動根據(jù)環(huán)境編碼轉為特定編碼后再顯示,所以y1在cmd命令行下正常顯示。

y2經過解碼和編碼后是utf-8格式,只能在環(huán)境編碼為utf-8的環(huán)境中才能正常顯示,在winows命令行下運行就會出現(xiàn)由于編碼不一致而導致的亂碼。

如果上述代碼再加一句print(s),將其分別在pycharm和cmd下運行,結果會是怎樣呢?

# encoding:gbk
s = "中文"
y1 = s.decode("gbk") #s.decode("gbk")這句話跟u“中文”效果是等價的
y2 = s.decode("gbk").encode("utf-8")
print(y1)
print(y2)
print(s)

E:\PycharmProjects\LEDdisplay2\venv\Scripts\python.exe E:/PycharmProjects/LEDdisplay2/1.py
中文
中文
????

Process finished with exit code 0

在pycharm環(huán)境下運行,輸出s會亂碼,因為pycharm環(huán)境編碼我們設置的是utf-8,文件開頭聲明編碼是gbk,編碼方式不一致,故亂碼。

在cmd環(huán)境下運行,輸出a不會亂碼,因為cmd環(huán)境編碼是GBK,而我們開頭文件聲明的編碼格式也是GBK,編碼方式一致,故正常顯示。

上述的代碼都是在python2環(huán)境下運行的,如果是python3的腳本的話,則要簡單得多。

因為python3中,所有的字符串不再受系統(tǒng)環(huán)境編碼的影響,統(tǒng)一使用Unicode來進行編碼,字符串類型統(tǒng)一為str,所以不再需要在中文前面加u來使中文字符變?yōu)閁nicode這種寫法。

而且所有python3的腳本默認都是utf-8來編碼的,所以我們也不需要在腳本開頭指定coding:utf-8了(但是一般建議寫上,兼容python2)。

打印顯示的時候也會方便很多,由于是字符串都是Unicode格式,所以不管在命令行中還是pycharm中,都會正常顯示而不會出現(xiàn)亂碼。

亂碼情況4

如果是直接在命令行中寫腳本,又會出現(xiàn)什么問題呢?

我們只需要弄清楚字符本身的編碼環(huán)境編碼是否一致就可以得出答案了。

在python shell(即命令行)中直接寫代碼運行時,我們需要知道的是,windows下命令行的默認編碼是gbk的,Linux環(huán)境下命令行的默認編碼是utf-8的。

缺圖

第一行我們在定義a="中文"時,并不會報錯,因為在命令行中默認是gbk編碼,所以此時其實a的編碼已經是gbk了,支持中文沒有任何問題。

直接顯示a變量時,打印出來的不是亂碼,而是該字符串的字節(jié)碼表示方式,大家可以理解成給計算機看的,不是給人看的,只有print出來的內容才是給人看的。

print(a)也不會報錯,因為按照gbk方式編碼并且在gbk環(huán)境中運行,不可能會出問題。

直接將a進行decode解碼時,解碼方式必須跟編碼方式是一致的,gbk方式編碼的內容不能用utf-8解碼為Unicode,只能用gbk解碼成Unicode。

用gbk進行decode之后,字符串會變?yōu)閁nicode,python會自動根據(jù)環(huán)境的編碼進行編碼,故可以正常顯示。

最后,我們將Unicode按照utf-8編碼時,字符的編碼格式又跟環(huán)境編碼不一致了,所以再次出現(xiàn)了亂碼。

linux下同理,只是linux下命令行的默認編碼格式是utf-8。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python如何根據(jù)頁碼處理PDF文件的內容

    Python如何根據(jù)頁碼處理PDF文件的內容

    在Python中,fitz庫可以用于多種任務,如打開PDF文件、遍歷頁面、添加注釋、提取文本、旋轉頁面等,此外,它還可以用于在PDF頁面上添加高亮注釋、提取圖像等操作,這篇文章主要介紹了Python根據(jù)頁碼處理PDF文件的內容,需要的朋友可以參考下
    2024-06-06
  • Python3實現(xiàn)連接SQLite數(shù)據(jù)庫的方法

    Python3實現(xiàn)連接SQLite數(shù)據(jù)庫的方法

    這篇文章主要介紹了Python3實現(xiàn)連接SQLite數(shù)據(jù)庫的方法,在Python數(shù)據(jù)庫編程中有著廣泛的應用,需要的朋友可以參考下
    2014-08-08
  • 對python制作自己的數(shù)據(jù)集實例講解

    對python制作自己的數(shù)據(jù)集實例講解

    今天小編就為大家分享一篇對python制作自己的數(shù)據(jù)集實例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • python Web應用程序測試selenium庫使用用法詳解

    python Web應用程序測試selenium庫使用用法詳解

    selenium主要是用來做自動化測試,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題本文詳細介紹了在python中selenium模塊的使用方法
    2021-10-10
  • 詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程

    詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程

    這篇文章主要介紹了詳解基于Jupyter notebooks采用sklearn庫實現(xiàn)多元回歸方程編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • PyCharm中Python解釋器如何選擇詳析

    PyCharm中Python解釋器如何選擇詳析

    這篇文章主要給大家介紹了關于PyCharm中Python解釋器如何選擇的相關資料,文中詳細分析了四種常見的Python環(huán)境管理工具,分別是venv、conda、pipenv和poetry,需要的朋友可以參考下
    2024-11-11
  • python復合條件下的字典排序

    python復合條件下的字典排序

    這篇文章主要介紹了python復合條件下的字典排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • Python實現(xiàn)的讀取文件內容并寫入其他文件操作示例

    Python實現(xiàn)的讀取文件內容并寫入其他文件操作示例

    這篇文章主要介紹了Python實現(xiàn)的讀取文件內容并寫入其他文件操作,結合實例形式分析了Python文件讀寫操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-04-04
  • 詳解如何使用Python處理INI、YAML和JSON配置文件

    詳解如何使用Python處理INI、YAML和JSON配置文件

    在軟件開發(fā)中,配置文件是存儲程序配置信息的常見方式,INI、YAML和JSON是常用的配置文件格式,各自有著特定的結構和用途,Python擁有豐富的庫和模塊,本文將重點探討如何使用Python處理這三種格式的配置文件,需要的朋友可以參考下
    2023-12-12
  • Django更新models數(shù)據(jù)庫結構步驟

    Django更新models數(shù)據(jù)庫結構步驟

    這篇文章主要介紹了Django更新models數(shù)據(jù)庫結構的操作步驟,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論