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

Python之string編碼問題

 更新時(shí)間:2023年02月28日 17:08:30   作者:Fighting-年輕人就該張牙舞爪  
這篇文章主要介紹了Python之string編碼問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一、前言

使用過Python的同學(xué)們一定被她的各種編碼問題纏繞過,因?yàn)槠匠>S護(hù)的新老項(xiàng)目跨越 2、3兩個(gè)版本,編碼問題有時(shí)更是讓我苦不堪言,遂下定決心,一定要干掉他,吃透他,遂記錄此篇博文以分享記錄!

什么是編碼?

通常我們所說的編碼一般為簡稱, 其實(shí)在平常的應(yīng)用過程,編碼一般包括 編碼和解碼,如在編碼前指定 字符集UTF-8, 那么解碼時(shí)也必須為UTF-8,否則會(huì)出現(xiàn)所謂的 亂碼

什么是字符集

字符集類似于中文,英文,是一個(gè)規(guī)則集合的抽象概念,其規(guī)定了某個(gè)文字對應(yīng)的二進(jìn)制數(shù)字存放方式,即為編碼過程,或者二進(jìn)制數(shù)字對應(yīng)的文字,即為解碼過程!

字符集包括如下:

1.字庫表

  • 字庫表是一個(gè)相當(dāng)于所有可讀或者可顯示字符的數(shù)據(jù)庫,字庫表決定了整個(gè)字符集能夠展現(xiàn)表示的所有字符的范圍

2.編碼字符集(通常簡稱 字符集)

  • 編碼字符集,用一個(gè)編碼值code point(二進(jìn)制代碼)來表示一個(gè)字符(即該字符在字庫表中的位置)

3.字符編碼

  • 字符編碼,是編碼字符集和實(shí)際存儲數(shù)值之間的轉(zhuǎn)換關(guān)系;
  • 字符,是根據(jù)字符編碼方案轉(zhuǎn)換為一個(gè)二進(jìn)制數(shù)值存儲在計(jì)算機(jī)中的

一個(gè)范例

下面以一個(gè)實(shí)例解釋下編解碼的過程

  • 字符編碼: UTF-8
  • 字符串:中國
  • Python版本:2.7

說明:

1.編碼轉(zhuǎn)換方式

str_unicode為中間碼。

即對應(yīng)編碼字符集 在字庫表中有唯一id代表一個(gè)字符, 理論上 unicode即可以映射表示所有字符,但是為了壓縮存儲的位數(shù),發(fā)展出了 utf-8、utf-16等字符編碼,即在實(shí)際存儲和字符展現(xiàn)之間又建立了一層映射,這層映射表示了 utf-8 到 unicode的方式,然后unicode又根據(jù)字庫表展現(xiàn)改字符。

unicode有 utf-8及utf-16等多種方式的字符編碼方案,GBK字符集 則只有一種字符編碼 EUC-CN, 而對于Ascii碼來說,本身即是編碼字符集又是字符編碼,

2.以一次Python代碼執(zhí)行為例, 解釋 字庫表編碼字符集(字符集) 字符編碼的關(guān)系:

utf-8編碼如何規(guī)定的?

單字節(jié)的字符,字節(jié)的第一位設(shè)為0,對于英語文本,UTF-8碼只占用一個(gè)字節(jié),和ASCII碼完全相同;

n個(gè)字節(jié)的字符(n>1),第一個(gè)字節(jié)的前n位設(shè)為1,第n+1位設(shè)為0,后面字節(jié)的前兩位都設(shè)為10,這n個(gè)字節(jié)的其余空位填充該字符unicode碼,高位用0補(bǔ)足。

UTF-8編碼方式

----------------------
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

utf-8和unicode的關(guān)系

  • utf 解釋為誒 Unicode TransferFormat 即 轉(zhuǎn)換Unicode。
  • unicode是一種字符編碼,規(guī)定了每個(gè)字符到數(shù)字的映射關(guān)系, 這個(gè)數(shù)字怎么存儲它沒有規(guī)定. 而如何存儲? 幾個(gè)字節(jié)表示? 這個(gè)是utf8等編碼方式來規(guī)定的。

有了unicode為什么還需要utf-8呢?

  • 首先 unicode 規(guī)定了所有字符的二進(jìn)制編碼,并沒有規(guī)定如何存儲
  • 如果我們以統(tǒng)一4個(gè)字節(jié)來存儲所有unicode的編碼字符,那就會(huì)在表示一個(gè)字節(jié)編碼的ascii部分嚴(yán)重浪費(fèi)存儲性能
  • 另外因?yàn)榻y(tǒng)一4字節(jié)處理,那如果一個(gè)文件分片或者是一份缺失文件,那么此時(shí)該如何來判斷我們從頭讀取的 4字節(jié)是一個(gè)完整的字符呢?這就會(huì)造成很大的分析復(fù)雜度,可以說 無法分析, 這也是 utf-8等編碼的優(yōu)點(diǎn)即utf-8錯(cuò)誤編碼不會(huì)向后擴(kuò)散
  • 綜合考慮 utf-8 是一種unicode 標(biāo)準(zhǔn)的存儲方案,改方案規(guī)定了如何存儲unicode字符,即看上面的utf-8的規(guī)定,大白話講就是 utf-8 可變長編碼規(guī)定了 字符的起始位置,且極大可能節(jié)省存儲空間,總而言之很簡單就是在無序中找到秩序

二、影響Python執(zhí)行的編碼方案

下列四種影響Python執(zhí)行的編碼方案,具體實(shí)例以最后所列案例為準(zhǔn)

1.Python解釋器的默認(rèn)編碼

獲取解釋器默認(rèn)編碼,Python3對應(yīng)的默認(rèn)編碼為 utf-8,Python2對應(yīng)的默認(rèn)編碼為ascii

import sys
print(sys.getdefaultencoding())

Python2設(shè)置默認(rèn)編碼方式,Python3解釋器默認(rèn)utf-8所以去除該種設(shè)置方式

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

解釋器編碼有什么用?

  • 當(dāng)調(diào)用 decode() 和 encode() 進(jìn)行編碼轉(zhuǎn)換時(shí)候,如果未指定編碼格式,會(huì)調(diào)用解釋器默認(rèn)編碼進(jìn)行編碼轉(zhuǎn)換
  • 若未指定編碼方式 而有中文出現(xiàn),此時(shí)會(huì)有報(bào)錯(cuò)產(chǎn)生

2.Python源文件文件編碼

python源文件的編碼與解碼,我們寫的python程序從產(chǎn)生到執(zhí)行的過程如下(以Pycharm為例)

依次為

編輯器 決定源代碼的編碼格式(編輯器中設(shè)置)

pycharm 會(huì)根據(jù)文件開頭的編碼聲明進(jìn)行文件格式保存

此種聲明保存的文件,是utf-8編碼的

# coding: utf-8

此種聲明保存的文件,是gbk編碼的

# coding: gbk

同時(shí)也可以在setting中進(jìn)行設(shè)置

解釋器按照Ascii或者聲明指定的方式解碼源代碼, 以下是 官方文檔給的解釋

Python will default to ASCII as standard encoding if no other encoding hints are given.

※: Python2中會(huì)按照編碼聲明對源代碼進(jìn)行解碼,如未指定 編碼聲明 則會(huì)以 Ascii進(jìn)行解碼,此時(shí)如果有中文會(huì)報(bào)錯(cuò)

※:Python3默認(rèn)以utf-8進(jìn)行解碼

若未指定編碼聲明, 而源代碼中有中文

此時(shí)Python2 會(huì)以Ascii 來進(jìn)行源代碼的'解碼';Python3 會(huì)默認(rèn)以  utf-8 進(jìn)行源代碼的'解碼'。    

若源文件編碼為utf-8, 而編碼聲明gbk

這種情況會(huì)出錯(cuò),因?yàn)榇疟P中保存的格式時(shí) gbk 格式的而卻以 utf-8 來進(jìn)行解碼,則會(huì)出錯(cuò)。

UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence

注意1:Python3將源代碼讀取到內(nèi)存中的字符串編碼為 unicode, 這樣的中間碼的方式,不會(huì)出現(xiàn)亂碼, Python2以文件頭聲明的方式將源代碼讀取到內(nèi)存中

注意2:Python2 在日常編程中一定注意 文件編碼 和 文件聲明要一致,如 文件編碼為 utf-8 則此時(shí)應(yīng)該如此聲明 # coding: utf-8, 若此時(shí)用gbk 做聲明,則此時(shí)會(huì)亂碼,一編一解 要成對

結(jié)果輸出,控制臺輸出日志文件

解釋器如何知道該文件的編碼格式?

# coding: utf-8

3.操作系統(tǒng)的語言設(shè)置

locale 模塊獲取 操作系統(tǒng)編碼

import locale
print locale.getdefaultencoding()

以open()函數(shù)為例

open() 函數(shù)會(huì)調(diào)用 Python操作系統(tǒng)默認(rèn)編碼進(jìn)行 編解碼

# coding: utf-8
import sys; reload(sys); sys.setdefaultencoding('utf-8')

str = '中國'  # utf-8  bytes類型
str_unicode = str.decode()  # unicode

with open('demo.txt', 'w') as f:
	f.write(str)  # 寫入bytes類型,則此時(shí)文件編碼為 utf-8 
	f.write(str_unicode)  # 寫入 unicode,則此時(shí)會(huì)根據(jù) sys.getdefaultencoding() 來進(jìn)行文件編碼

linux 下 vim打開以 gbk方式寫入的文件會(huì)出現(xiàn)亂碼,因?yàn)榇藭r(shí)會(huì)調(diào)用操作系統(tǒng)的編碼方式進(jìn)行解碼

4.Terminal使用的編碼

終端編碼 繼承自操作系統(tǒng)的編碼

三、 Python中的編碼表示范例

1.utf-8表示中文你好

print("你好".encode('utf-8'))
>>> b'\xe4\xbd\xa0\xe5\xa5\xbd'

很容易看出 其中的 16進(jìn)制數(shù) e4bda0e5a5bd

2.Python中的len表示什么

  • 對于字節(jié)流(bytes: 如utf-8字節(jié)流)來說表示字節(jié)數(shù)
  • 對于unicode則表示字符數(shù)

三、最后

使用范例

Pycharm編碼設(shè)置

  • 字符串變量級別編碼
  • 腳本級別的編碼
  • py文件級別的編碼
  • 顯示窗口的編碼

問題收集 python3 unicode字符轉(zhuǎn)中文

a = "\\u4ea7\\u54c1\\u72b6\\u6001"

# 兩種方式
print(eval(f'u"{a}"'))	
print(a.encode().decode("unicode_escape"))

即 一個(gè)字符可以是一個(gè)中文漢字、一個(gè)英文字母、一個(gè)阿拉伯?dāng)?shù)字、一個(gè)標(biāo)點(diǎn)符號等 ??

如:Unicode、ASCII

總結(jié)

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

相關(guān)文章

  • Python Django項(xiàng)目和應(yīng)用的創(chuàng)建詳解

    Python Django項(xiàng)目和應(yīng)用的創(chuàng)建詳解

    這篇文章主要為大家介紹了Python Django項(xiàng)目和應(yīng)用的創(chuàng)建,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Python字符串拼接、截取及替換方法總結(jié)分析

    Python字符串拼接、截取及替換方法總結(jié)分析

    這篇文章主要介紹了Python字符串拼接、截取及替換方法,結(jié)合實(shí)例形式總結(jié)分析了Python針對字符串的拼接、截取與替換的原理與常見使用技巧,需要的朋友可以參考下
    2016-04-04
  • opencv-python 提取sift特征并匹配的實(shí)例

    opencv-python 提取sift特征并匹配的實(shí)例

    今天小編就為大家分享一篇opencv-python 提取sift特征并匹配的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python中用表格格式打印列表的兩種實(shí)現(xiàn)

    Python中用表格格式打印列表的兩種實(shí)現(xiàn)

    本文將詳細(xì)介紹如何在 Python 中以表格格式打印列表,以便更好地展示和呈現(xiàn)數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Python實(shí)踐之使用Pandas進(jìn)行數(shù)據(jù)分析

    Python實(shí)踐之使用Pandas進(jìn)行數(shù)據(jù)分析

    在數(shù)據(jù)分析領(lǐng)域,Python的Pandas庫是一個(gè)非常強(qiáng)大的工具。這篇文章將為大家詳細(xì)介紹如何使用Pandas進(jìn)行數(shù)據(jù)分析,希望對大家有所幫助
    2023-04-04
  • python實(shí)現(xiàn)的簡單猜數(shù)字游戲

    python實(shí)現(xiàn)的簡單猜數(shù)字游戲

    這篇文章主要介紹了python實(shí)現(xiàn)的簡單猜數(shù)字游戲,涉及Python操作隨機(jī)數(shù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 在pandas多重索引multiIndex中選定指定索引的行方法

    在pandas多重索引multiIndex中選定指定索引的行方法

    今天小編就為大家分享一篇在pandas多重索引multiIndex中選定指定索引的行方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python入門教程之識別驗(yàn)證碼

    python入門教程之識別驗(yàn)證碼

    這篇文章主要介紹了python中識別驗(yàn)證碼的相關(guān)資料,這屬于學(xué)習(xí)python的基本入門教程,文中介紹的非常詳細(xì),文末也給出了完整的示例代碼,需要的朋友們可以參考學(xué)習(xí),下面來一起看看吧。
    2017-03-03
  • Python 批量操作設(shè)備的實(shí)現(xiàn)步驟

    Python 批量操作設(shè)備的實(shí)現(xiàn)步驟

    本文將結(jié)合實(shí)例代碼,介紹Python 批量操作設(shè)備的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • python模塊中判斷全局變量的賦值的實(shí)例講解

    python模塊中判斷全局變量的賦值的實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python模塊中判斷全局變量的賦值的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03

最新評論

临泽县| 绥德县| 西峡县| 乐陵市| 日喀则市| 黑河市| 嘉祥县| 通榆县| 灵宝市| 阿瓦提县| 江华| 兴国县| 达孜县| 龙州县| 康乐县| 岳普湖县| 临澧县| 裕民县| 波密县| 惠水县| 东乌珠穆沁旗| 丰镇市| 大厂| 井研县| 嘉祥县| 衡阳县| 宁化县| 剑河县| 郴州市| 灵宝市| 沂水县| 筠连县| 梅州市| 祁阳县| 山东省| 正阳县| 永定县| 锡林郭勒盟| 屏山县| 沧源| 遂川县|