最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python2中的中文亂碼

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

python2中文亂碼問(wèn)題

python2中的中文亂碼情況,本文將從一下四種情況進(jìn)行展開(kāi)。

下面兩句話(huà)是本文的重點(diǎn),文中的內(nèi)容都是圍繞下面兩句話(huà)展開(kāi)的

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

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

亂碼情況1

python2默認(rèn)使用ASCII來(lái)編碼代碼的,如果代碼中出現(xiàn)中文,那么就必須在py文件的開(kāi)頭注明支持中文的編碼格式,如果沒(méi)有聲明,python2就會(huì)使用默認(rèn)的ASCII編碼來(lái)識(shí)別中文,就會(huì)報(bào)錯(cuò)。

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

上述報(bào)錯(cuò)翻譯過(guò)來(lái)就是,在1.py文件的第一行有非ASCII字符“\e4”,而且沒(méi)有聲明編碼。

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

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

使用nodepad++查看十六進(jìn)制

python2默認(rèn)編碼格式ASCII編碼是不認(rèn)識(shí)“\xe4”的,無(wú)法識(shí)別“中文”,所以會(huì)報(bào)錯(cuò)。

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

補(bǔ)充:

  • 代碼查看python環(huán)境的默認(rèn)編碼
  • 代碼查看字符串的十六進(jì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

如果我們?cè)趐y文件開(kāi)頭聲明腳本的編碼格式為utf-8,設(shè)置編輯器pycharm的環(huán)境編碼為GBK,那么,當(dāng)我們打印中文時(shí),會(huì)出現(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編碼設(shè)置:

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

解決方法有以下幾種:

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

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

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

3.在變量s前加一個(gè)u,將其強(qiáng)制轉(zhuǎn)換為Unicode編碼(前面已經(jīng)說(shuō)過(guò)了,對(duì)于Unicode編碼的字符,python打印時(shí)會(huì)自動(dòng)根據(jù)環(huán)境編碼轉(zhuǎn)為特定編碼后再顯示)

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

# encoding:utf-8
s = "中文"
y1 = s.decode("utf-8") # s.decode("utf-8")這句話(huà)跟u“中文”效果是等價(jià)的
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的時(shí)候都是需要指定編碼的。

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

  • encode的正常使用:對(duì)Unicode類(lèi)型進(jìn)行encode,得到字節(jié)串str類(lèi)型。也即是Unicode-> encode(根據(jù)指定編碼) -> str。
  • decode的正常使用:對(duì)str類(lèi)型進(jìn)行decode,得到Unicode類(lèi)型。也即是str -> decode(根據(jù)指定編碼) -> Unicode。
  • encode的不正常使用:對(duì)str類(lèi)型進(jìn)行encode,因?yàn)閑ncode需要的是Unicode類(lèi)型,這個(gè)時(shí)候python會(huì)用默認(rèn)編碼decode成Unicode類(lèi)型,再用你給出編碼進(jìn)行encode。(注意這里默認(rèn)編碼不是開(kāi)頭的encoding,而是ASCII編碼)
  • decode的不正常使用:對(duì)Unicode類(lèi)型進(jìn)行decode,python會(huì)用默認(rèn)的系統(tǒng)編碼encode成str類(lèi)型,再用你給出的編碼進(jìn)行decode。

另外,需要注意的是,用什么字符編碼對(duì)Unicode進(jìn)行編碼(編碼為str類(lèi)型),就要用對(duì)應(yīng)的字符編碼對(duì)str類(lèi)型進(jìn)行解碼(解碼為Unicode類(lèi)型)

舉個(gè)不正常使用的例子:

# 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的默認(rèn)編碼是ASCII編碼,直接對(duì)str類(lèi)型的變量s進(jìn)行encode時(shí),python會(huì)使用默認(rèn)編碼ASCII碼將變量s先deconde成Unicode,而文件開(kāi)頭已經(jīng)聲明代碼用utf-8編碼,所以會(huì)報(bào)ASCII碼無(wú)法decode字節(jié)“0xe4”,而“0xe4”是utf-8編碼存儲(chǔ)變量s=“中文”的第一個(gè)字節(jié)的十六進(jìn)制表示。

亂碼情況3

將下面代碼文件(存儲(chǔ)時(shí)選擇utf-8編碼)直接在命令行里面運(yùn)行,又會(huì)發(fā)生什么問(wèn)題呢?

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

缺圖,

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

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

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

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

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

# encoding:gbk
s = "中文"
y1 = s.decode("gbk") #s.decode("gbk")這句話(huà)跟u“中文”效果是等價(jià)的
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)境下運(yùn)行,輸出s會(huì)亂碼,因?yàn)閜ycharm環(huán)境編碼我們?cè)O(shè)置的是utf-8,文件開(kāi)頭聲明編碼是gbk,編碼方式不一致,故亂碼。

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

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

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

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

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

亂碼情況4

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

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

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

缺圖

第一行我們?cè)诙xa="中文"時(shí),并不會(huì)報(bào)錯(cuò),因?yàn)樵诿钚兄心J(rèn)是gbk編碼,所以此時(shí)其實(shí)a的編碼已經(jīng)是gbk了,支持中文沒(méi)有任何問(wèn)題。

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

print(a)也不會(huì)報(bào)錯(cuò),因?yàn)榘凑誫bk方式編碼并且在gbk環(huán)境中運(yùn)行,不可能會(huì)出問(wèn)題。

直接將a進(jìn)行decode解碼時(shí),解碼方式必須跟編碼方式是一致的,gbk方式編碼的內(nèi)容不能用utf-8解碼為Unicode,只能用gbk解碼成Unicode。

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

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

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

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python關(guān)鍵字?asynico基本用法

    Python關(guān)鍵字?asynico基本用法

    asyncio是Python的異步編程庫(kù),用于編寫(xiě)并發(fā)程序,它提供了一組基于協(xié)程的工具,可以幫助你實(shí)現(xiàn)異步網(wǎng)絡(luò)通信、并發(fā)計(jì)算等任務(wù),這篇文章主要介紹了Python關(guān)鍵字?asynico,需要的朋友可以參考下
    2023-01-01
  • Python Pandas中rolling方法的使用指南

    Python Pandas中rolling方法的使用指南

    在數(shù)據(jù)分析和時(shí)間序列數(shù)據(jù)處理中,經(jīng)常需要執(zhí)行滾動(dòng)計(jì)算或滑動(dòng)窗口操作,Pandas庫(kù)提供了rolling方法,用于執(zhí)行這些操作,下面我們就來(lái)學(xué)習(xí)一下rolling方法的具體使用吧
    2023-11-11
  • python中enumerate函數(shù)遍歷元素用法分析

    python中enumerate函數(shù)遍歷元素用法分析

    這篇文章主要介紹了python中enumerate函數(shù)遍歷元素用法,結(jié)合實(shí)例形式分析了enumerate函數(shù)遍歷元素的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-03-03
  • Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能示例

    Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能示例

    這篇文章主要介紹了Python基于TCP實(shí)現(xiàn)會(huì)聊天的小機(jī)器人功能,結(jié)合實(shí)例形式分析了Python通過(guò)socket模塊實(shí)現(xiàn)TCP連接的客戶(hù)端與服務(wù)器端模擬聊天機(jī)器人功能相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • 利用Python校準(zhǔn)本地時(shí)間的方法教程

    利用Python校準(zhǔn)本地時(shí)間的方法教程

    這篇文章主要給大家介紹了關(guān)于如何利用Python校準(zhǔn)本地時(shí)間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Python中.join()和os.path.join()兩個(gè)函數(shù)的用法詳解

    Python中.join()和os.path.join()兩個(gè)函數(shù)的用法詳解

    join()是連接字符串?dāng)?shù)組而os.path.join()是將多個(gè)路徑組合后返回。接下來(lái)通過(guò)本文重點(diǎn)給大家介紹Python中.join()和os.path.join()兩個(gè)函數(shù)的用法,感興趣的朋友一起看看吧
    2018-06-06
  • python編寫(xiě)小程序探測(cè)linux端口占用情況

    python編寫(xiě)小程序探測(cè)linux端口占用情況

    這篇文章主要介紹了python編寫(xiě)小程序探測(cè)linux端口占用情況,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-12-12
  • idea創(chuàng)建springMVC框架和配置小文件的教程圖解

    idea創(chuàng)建springMVC框架和配置小文件的教程圖解

    本文通過(guò)圖文并茂的形式給大家介紹了idea創(chuàng)建springMVC框架和配置小文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-09-09
  • Python利用watchdog模塊監(jiān)控文件變化

    Python利用watchdog模塊監(jiān)控文件變化

    這篇文章主要為大家介紹一個(gè)Python中的模塊:watchdog模塊,它可以實(shí)現(xiàn)監(jiān)控文件的變化。文中通過(guò)示例詳細(xì)介紹了watchdog模塊的使用,需要的可以參考一下
    2022-06-06
  • 使用Tkinter制作信息提示框

    使用Tkinter制作信息提示框

    這篇文章主要介紹了使用Tkinter制作信息提示框的相關(guān)資料,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

安阳县| 清丰县| 遂昌县| 景德镇市| 通榆县| 通榆县| 靖远县| 虎林市| 尼木县| 来凤县| 新和县| 永修县| 大邑县| 囊谦县| 全椒县| 安康市| 高平市| 沙河市| 丰台区| 宁化县| 沁源县| 嘉义市| 伊宁县| 桐梓县| 潮州市| 庐江县| 开封县| 涿州市| 广宁县| 忻州市| 西充县| 庄河市| 凭祥市| 鹿邑县| 庆安县| 眉山市| 汉沽区| 清新县| 肃南| 和平县| 沿河|