99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python中的默認(rèn)編碼

麥辣雞腿堡 ? 來源:Python都知道 ? 作者:了不起 ? 2023-07-05 16:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

圖片

2. 默認(rèn)編碼

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

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

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

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

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

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

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. 最佳實(shí)踐

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

    關(guān)注

    6

    文章

    969

    瀏覽量

    55798
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4827

    瀏覽量

    86830
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

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

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

    python默認(rèn)的解釋器并不支持tab補(bǔ)全

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

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

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

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

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

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

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

    科普:Python函數(shù)默認(rèn)返回 None 的原因

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

    Python 函數(shù)默認(rèn)返回None的原因

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

    Python中最基本的10個內(nèi)容

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

    如何在Ubuntu安裝IDLE Python IDE

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

    Python編碼與解碼

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

    Python2與Python3對字符串的支持

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

    Python字符編碼轉(zhuǎn)換

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

    mysql數(shù)據(jù)庫默認(rèn)字符編碼是什么

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

    python如何保存文件

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

    查看python安裝路徑的方法

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