0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python中的默認編碼

麥辣雞腿堡 ? 來源:Python都知道 ? 作者:了不起 ? 2023-07-05 16:11 ? 次閱讀

####1. Python源代碼文件的執(zhí)行過程

我們都知道,磁盤上的文件都是以二進制格式存放的,其中文本文件都是以某種特定編碼的字節(jié)形式存放的。對于程序源代碼文件的字符編碼是由編輯器指定的,比如我們使用Pycharm來編寫Python程序時會指定工程編碼和文件編碼為UTF-8,那么Python代碼被保存到磁盤時就會被轉換為UTF-8編碼對應的字節(jié)(encode過程)后寫入磁盤。當執(zhí)行Python代碼文件中的代碼時,Python解釋器在讀取Python代碼文件中的字節(jié)串之后,需要將其轉換為UNICODE字符串(decode過程)之后才執(zhí)行后續(xù)操作。

上面已經解釋過,這個轉換過程(decode,解碼)需要我們指定文件中保存的字節(jié)使用的字符編碼是什么,才能知道這些字節(jié)在UNICODE這張萬國碼和統(tǒng)一碼中找到其對應的代碼點是什么。這里指定字符編碼的方式大家都很熟悉,如下所示:

# -*- coding:utf-8 -*-

圖片

2. 默認編碼

那么,如果我們沒有在代碼文件開始的部分指定字符編碼,Python解釋器就會使用哪種字符編碼把從代碼文件中讀取到的字節(jié)轉換為UNICODE代碼點呢?就像我們配置某些軟件時,有很多默認選項一樣,需要在Python解釋器內部設置默認的字符編碼來解決這個問題,這就是文章開頭所說的“默認編碼”。因此大家所說的Python中文字符問題就可以總結為一句話: 當無法通過默認的字符編碼對字節(jié)進行轉換時,就會出現解碼錯誤(UnicodeEncodeError) 。

Python2和Python3的解釋器使用的默認編碼是不一樣的,我們可以通過sys.getdefaultencoding()來獲取默認編碼:

>> > # Python2
 >> > import sys
 >> > sys.getdefaultencoding()
'ascii'

 >> > # Python3
 >> > import sys
 >> > sys.getdefaultencoding()
'utf-8'

因此,對于Python2來講,Python解釋器在讀取到中文字符的字節(jié)碼嘗試解碼操作時,會先查看當前代碼文件頭部是否有指明當前代碼文件中保存的字節(jié)碼對應的字符編碼是什么。如果沒有指定則使用默認字符編碼"ASCII"進行解碼導致解碼失敗,導致如下錯誤:

SyntaxError: Non-ASCII character '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

對于Python3來講,執(zhí)行過程是一樣的,只是Python3的解釋器以"UTF-8"作為默認編碼,但是這并不表示可以完全兼容中文問題。比如我們在Windows上進行開發(fā)時,Python工程及代碼文件都使用的是默認的GBK編碼,也就是說Python代碼文件是被轉換成GBK格式的字節(jié)碼保存到磁盤中的。Python3的解釋器執(zhí)行該代碼文件時,試圖用UTF-8進行解碼操作時,同樣會解碼失敗,導致如下錯誤:

SyntaxError: Non-UTF-8 code starting with '\\xc4' in file xxx.py on line 11, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

3. 最佳實踐

  • 創(chuàng)建一個工程之后先確認該工程的字符編碼是否已經設置為UTF-8
  • 為了兼容Python2和Python3,在代碼頭部聲明字符編碼:-*- coding:utf-8 -*-
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編碼
    +關注

    關注

    6

    文章

    932

    瀏覽量

    54731
  • python
    +關注

    關注

    55

    文章

    4767

    瀏覽量

    84376
收藏 人收藏

    評論

    相關推薦

    Python中文亂碼怎么處理?python中文亂碼解決辦法

    `Python中出現亂碼,英文顯示沒問題,一般是中文輸出出現了編碼問題,如果python文件沒有指定編碼,在執(zhí)行過程中就會出現報錯!
    發(fā)表于 12-27 15:13

    python默認的解釋器并不支持tab補全

    雖然python在linux系統(tǒng)默認安裝的,但是python默認的解釋器并不支持tab補全,所以推薦使用ipython。
    發(fā)表于 07-11 07:22

    從5個方面來解析計算機的字符編碼概念

    字符編碼是計算機編程不可回避的問題,不管你用 Python2 還是 Python3,亦或是 C++, Java 等,我都覺得非常有必要厘清計算機
    的頭像 發(fā)表于 01-16 09:08 ?7873次閱讀
    從5個方面來解析計算機<b class='flag-5'>中</b>的字符<b class='flag-5'>編碼</b>概念

    從RHEL 8 Beta開始不再默認系統(tǒng)Python版本

    為了改善用戶體驗,從 RHEL 8 Beta 開始不再強調“系統(tǒng) Python”,不再默認一個 Python 版本。
    的頭像 發(fā)表于 12-30 14:23 ?1883次閱讀

    Python編碼規(guī)范是怎么樣的

    建議使用Emacs 的Python-mode 默認值: 4 個空格一個縮進層次。對于確實古老的代碼,若不希望產生混亂,可以繼續(xù)使用8 空格的制表符。在Emacs 的Python-mode 中會自動
    發(fā)表于 08-12 16:03 ?3次下載
    <b class='flag-5'>Python</b>的<b class='flag-5'>編碼</b>規(guī)范是怎么樣的

    科普:Python函數默認返回 None 的原因

    Python 有一項默認的做法,很多編程語言都沒有——它的所有函數都會有一個返回值,不管你有沒有寫 return 語句。
    的頭像 發(fā)表于 08-17 11:39 ?2333次閱讀

    Python 函數默認返回None的原因

    Python 函數默認返回None是什么原因?定義的函數沒有返回值,Python 解釋器就會強行地默認給注入一段返回邏輯!實際上 Python
    的頭像 發(fā)表于 08-21 10:51 ?2592次閱讀
    <b class='flag-5'>Python</b> 函數<b class='flag-5'>默認</b>返回None的原因

    Python中最基本的10個內容

    時會遇上亂碼問題,其原因是字符集的編碼問題。Linux和Mac默認編碼集是UTF8,而Windows則是
    發(fā)表于 12-11 11:54 ?1661次閱讀

    如何在Ubuntu安裝IDLE Python IDE

    當初學Python時,設置編碼環(huán)境可能會很具有挑戰(zhàn)性。IDLE(集成開發(fā)和學習環(huán)境)是一個Python IDE,可簡化相同的過程。安裝后,您可以立即開始編碼。
    的頭像 發(fā)表于 04-10 10:29 ?706次閱讀

    Python編碼與解碼

    先做下科普:UNICODE字符編碼,也是一張字符與數字的映射,但是這里的數字被稱為代碼點(code point), 實際上就是十六進制的數字。 Python官方文檔對Unicode字符串、字節(jié)串
    的頭像 發(fā)表于 07-05 15:59 ?694次閱讀

    Python2與Python3對字符串的支持

    其實Python3對字符串支持的改進,不僅僅是更改了默認編碼,而是重新進行了字符串的實現,而且它已經實現了對UNICODE的內置支持,從這方面來講
    的頭像 發(fā)表于 07-05 16:15 ?693次閱讀

    Python字符編碼轉換

    UNICODE字符串可以與任意字符編碼的字節(jié)進行相互轉換,如圖: 那么大家很容易想到一個問題,就是不同的字符編碼的字節(jié)可以通過Unicode相互轉換嗎?答案是肯定的。 Python2
    的頭像 發(fā)表于 07-05 16:25 ?1037次閱讀
    <b class='flag-5'>Python</b>字符<b class='flag-5'>編碼</b>轉換

    mysql數據庫默認字符編碼是什么

    MySQL數據庫的默認字符編碼是utf8mb4。下面我將詳細介紹MySQL數據庫的字符編碼相關知識,并展開討論相應的配置、應用和注意事項。 一、MySQL數據庫字符編碼簡介 什么是字符
    的頭像 發(fā)表于 11-16 14:50 ?1503次閱讀

    python如何保存文件

    ( 'Hello, world!' ) 在上面的例子,'filename.txt'是文件的路徑,'w'是打開文件的模式,表示寫入模式,encoding參數可選,指定文件的編碼方式,默認為系統(tǒng)的
    的頭像 發(fā)表于 11-24 09:32 ?1075次閱讀

    查看python安裝路徑的方法

    。 方法一:使用Python自帶安裝程序的默認路徑 Python的安裝程序通常會將Python解釋器安裝在默認的路徑
    的頭像 發(fā)表于 11-29 14:54 ?1.1w次閱讀