日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python的unicode编码表_Python-编码

發布時間:2023/12/9 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python的unicode编码表_Python-编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

字符編碼的常用種類介紹

第一種:ASCII碼

ASCII(American Standard Code for Information Interchange,美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統,主要用于顯示現代英語和其他西歐語言。它是現今最通用的單字節編碼系統,并等同于國際標準ISO/IEC 646。如下圖所示:

由于計算機是美國人發明的,因此,最早只有127個字母被編碼到計算機里,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱為ASCII編碼,比如大寫字母?A的編碼是65,小寫字母?a的編碼是97。后128個稱為擴展ASCII碼。

在這里,每一位0或者1所占的空間單位為bit(比特),這是計算機中最小的表示單位,每8個bit組成一個字符,這是計算機中最小的存儲單位。

常見換算單位:

bit 位,計算機中最小的表示單位

8bit = 1bytes 字節,最小的存儲單位,1bytes縮寫為1B

1KB=1024B

1MB=1024KB

1GB=1024MB

1TB=1024GB

第二種:GBK 和 GB2312

對于我們來說能在計算機中顯示中文字符是至關重要的,然而ASCII表里連一個偏旁部首也沒有。所以我們還需要一張關于中文和數字對應的關系表。一個字節只能最多表示256個字符,要處理中文顯然一個字節是不夠的,所以我們需要采用兩個字節來表示,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。

第三種:Unicode

但如以來,就會出現一個問題,各個國家都一套自己的編碼,就不可避免會有沖突,這是該怎么辦呢?

因此,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。

Unicode標準也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)。現代操作系統和大多數編程語言都直接支持Unicode。

現在,分析一下ASCII編碼和Unicode編碼的區別:

ASCII編碼是1個字節,而Unicode編碼通常是2個字節。

字母A用ASCII編碼是十進制的65,二進制的01000001;

字符0用ASCII編碼是十進制的48,二進制的00110000;

漢字“中”已經超出了ASCII編碼的范圍,用Unicode編碼是十進制的20013,二進制的01001110 00101101。

如果把ASCII編碼的A用Unicode編碼,只需要在前面補0就可以,因此,A的Unicode編碼是00000000 01000001。

但如果統一成Unicode編碼,亂碼問題從此消失了。但是,如果你寫的文本基本上全部是英文的話,用Unicode編碼比ASCII編碼需要多一倍的存儲空間,在存儲和傳輸上就十分不劃算。

第四種:UTF-8

基于節約的原則,出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。如果你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間了。如下所示:

從上面的表格還可以發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上可以被看成是UTF-8編碼的一部分,所以,大量只支持ASCII編碼的歷史遺留軟件可以在UTF-8編碼下繼續工作。

我們總結一下現在計算機系統通用的字符編碼工作方式:

在計算機內存中,統一使用Unicode編碼,當需要保存到硬盤或者需要傳輸的時候,就轉換為UTF-8編碼。

用記事本編輯的時候,從文件讀取的UTF-8字符被轉換為Unicode字符到內存里,編輯完成后,保存的時候再把Unicode轉換為UTF-8保存到文件。如下圖:

主要內容:

前言:

學習Python,字符編碼間的轉換是繞不過去的一只攔路虎,不把編碼徹底搞明白,總有一天它會猝不及防坑你一把。

Python2.x和Python3.x在字符編碼的設置上也有很大區別(Python3未來將是主流,所以Python3為主),今天我們就來一起學習下。

上一篇文章里我已經簡述了Python的常見編碼了,這里就不再贅述了,還不清楚的小伙伴可以先去看下:??http://www.cnblogs.com/schut/p/8406897.html

一、Unicode 和 UTF-8的愛恨糾葛

Unicode 起到了2個作用:

直接支持全球所有語言,每個國家都可以不用再使用自己之前的舊編碼了,用unicode就可以了。(就跟英語是全球統一語言一樣)

unicode包含了跟全球所有國家編碼的映射關系。

Unicode解決了字符和二進制的對應關系,但是使用unicode表示一個字符,太浪費空間。

例如:利用unicode表示“Python”需要12個字節才能表示,比原來ASCII表示增加了1倍。

由于計算機的內存比較大,并且字符串在內容中表示時也不會特別大,所以內容可以使用unicode來處理,但是存儲和網絡傳輸時一般數據都會非常多,那么增加1倍將是無法容忍的!!!

為了解決存儲和網絡傳輸的問題,出現了Unicode Transformation Format,學術名UTF,即:對unicode中的進行轉換,以便于在存儲和網絡傳輸時可以節省空間!

UTF-8: 使用1、2、3、4個字節表示所有字符;優先使用1個字符、無法滿足則使增加一個字節,最多4個字節。英文占1個字節、歐洲語系占2個、東亞語系占3個,其它及特殊字符占4個。

UTF-16: 使用2、4個字節表示所有字符;優先使用2個字節,否則使用4個字節表示。

UTF-32: 使用4個字節表示所有字符。

總結:UTF 是為unicode編碼 設計 的一種在存儲和傳輸時節省空間的編碼方案。

二、字符在硬盤上的存儲

首先要明確的一點就是,無論以什么編碼在內存里顯示字符,存到硬盤上都是2進制(0b是說明這段數字是二進制,0x表示是16進制。0x幾乎所有的編譯器都支持,而支持0b的并不多)。理解這一點很重要。

比如:

ascii編碼(美國):

l 0b1101100

o 0b1101111

v 0b1110110

e 0b1100101

GBK編碼(中國):

老 0b11000000 0b11001111

男 0b11000100 0b11010000

孩 0b10111010 0b10100010

還要注意的一點是:存到硬盤上時是以何種編碼存的,再從硬盤上讀出來時,就必須以何種編碼讀(開頭聲明或轉換),要不然就亂了。

三、編碼的轉換雖然有了unicode and utf-8 ,但是由于歷史問題,各個國家依然在大量使用自己的編碼,

比如中國的windows,默認編碼依然是gbk,而不是utf-8。

基于此,如果中國的軟件出口到美國,在美國人的電腦上就會顯示亂碼,因為他們沒有gbk編碼。

所以該怎么辦呢?

還記得我們講unicode其中一個功能是其包含了跟全球所有國家編碼的映射關系,這時就派上用場了。

無論你以什么編碼存儲的數據,只要你的軟件在把數據從硬盤讀到內存里,轉成unicode來顯示,就可以了。

由于所有的系統、編程語言都默認支持unicode,那你的gbk軟件放到美國電腦上,加載到內存里,變成了unicode,

中文就可以正常展示啦。

Python3執行過程

1、解釋器找到代碼文件,把代碼字符串按文件頭定義的編碼加載到內存,轉成unicode

2、把代碼字符串按照語法規則進行解釋

3、所有的變量字符都會以unicode編碼聲明

在py3上 把你的代碼以utf-8編寫, 保存,然后在windows上執行。

發現可以正常執行!

其實utf-8編碼之所以能在windows gbk的終端下顯示正常,是因為到了內存里python解釋器把utf-8轉成了unicode ,

但是這只是python3, 并不是所有的編程語言在內存里默認編碼都是unicode,比如 萬惡的python2 就不是,

它是ASCII(龜叔當初設計Python時的一點缺陷),想寫中文,就必須聲明文件頭的coding為gbk or utf-8, 聲明之后,python2解釋器

僅以文件頭聲明的編碼去解釋你的代碼,加載到內存后,并不會主動幫你轉為unicode,也就是說,你的文件編碼是utf-8,

加載到內存里,你的變量字符串就也是utf-8, 這意味著什么?意味著,你以utf-8編碼的文件,在windows是亂碼。

其實亂是正常的,不亂才不正常,因為只有2種情況 ,你的windows上顯示才不會亂。

Python2并不會自動的把文件編碼轉為unicode存在內存里。

1、字符串以GBK格式顯示

2、字符串是unicode編碼

所以我們只有手動轉,Python3 自動把文件編碼轉為unicode必定是調用了什么方法,這個方法就是,decode(解碼) 和encode(編碼)。

方法如下:

UTF-8/GBK --> decode 解碼 --> Unicode

Unicode --> encode 編碼 --> GBK / UTF-8

例如:

#!/usr/bin/env python3

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

# write by congcong

s = '匆匆'

print(s)

s1 = s.decode("utf-8") # utf-8 轉成 Unicode,decode(解碼)需要注明當前編碼格式

print(s1,type(s1))

s2 = s1.encode("gbk") # unicode 轉成 gbk,encode(編碼)需要注明生成的編碼格式

print(s2,type(s2))

s3 = s1.encode("utf-8") # unicode 轉成 utf-8,encode(編碼)注明生成的編碼格式

print(s3,type(s3))

文件在 Python2 和 Python3 環境下運行結果的區別,如下所示:

#coding:utf-8

s = "你好,中國!"

print(s) # Python2輸出亂碼,Python3正常輸出

print(type(s)) # 均輸出

#解碼成unicode

s1 = s.decode("utf-8")

print(s1) # Python2中輸出 “你好,中國!”,Python3顯示'str'對象沒有屬性'decode'

print(type(s1)) # Python2中輸出 Python3中輸出

#編碼成gbk 或 utf-8

s2 = s1.encode('gbk')

print(s2) # Python2中輸出 “你好,中國!”

print(type(s2)) # Python2中輸出

s3 = s1.encode('utf-8')

print(s3) # Python2輸出亂碼,

print(type(s3)) # 輸出

編碼相互轉換的規則如下:

四、如何驗證編碼轉對了呢?

1、查看數據類型,python 2 里有專門的unicode 類型

2、查看unicode編碼映射表

unicode字符是有專門的unicode類型來判斷的,但是utf-8,gbk編碼的字符都是str,你如果分辨出來的當前的字符串數據是何種編碼的呢?

有人說可以通過字節長度判斷,因為utf-8一個中文占3字節,gbk一個占2字節。

看輸出的字節個數,也能大體判斷是什么類型。精確的驗證一個字符的編碼呢,就是拿這些16進制的數跟編碼表里去匹配。

關于 Unicode 與 GBK 等編碼對應關系(以中文“路”為例):

完整的編碼對應表可到這個網站下載:unicode與gbk的映射表?http://www.unicode.org/charts/

五、Python bytes類型

把8個二進制一組稱為一個byte,用16進制來表示。為的就是讓人們看起來更可讀。我們稱之為bytes類型,即字節類型。

python2的字符串其實更應該稱為字節串。 通過存儲方式就能看出來, 但python2里還有一個類型是bytes呀,難道又叫bytes又叫字符串?

嗯 ,是的,在python2里,bytes == str , 其實就是一回事。

除此之外呢, python2里還有個單獨的類型是unicode , 把字符串解碼后,就會變成unicode。

>>> s

'\xe8\xb7\xaf\xe9\xa3\x9e' #utf-8

>>> s.decode('utf-8')

u'\u8def\u98de' #unicode 在unicode編碼表里對應的位置

>>> print(s.decode('utf-8'))

路飛 #unicode 格式的字符

Python2的默認編碼是ASCII碼,當后來大家對支持漢字、日文、法語等語言的呼聲越來越高時,Python于是準備引入unicode,但若直接把默認編碼改成unicode的話是不現實的,因為很多軟件就是基于之前的默認編碼ASCII開發的,編碼一換,那些軟件的編碼就都亂了。所以Python 2就直接搞了一個新的字符類型,就叫unicode類型,比如你想讓你的中文在全球所有電腦上正常顯示,在內存里就得把字符串存成unicode類型。

>>> s = "路飛"

>>> s

'\xe8\xb7\xaf\xe9\xa3\x9e'

>>> s2 = s.decode("utf-8")

>>> s2

u'\u8def\u98de'

>>> type(s2)

注意:

Python3 除了把字符串的編碼改成了unicode, 還把str 和bytes 做了明確區分, str 就是unicode格式的字符, bytes就是單純二進制啦。

在py3里看字符,必須得是unicode編碼,其它編碼一律按bytes格式展示。

Python只要出現各種編碼問題,無非是哪里的編碼設置出錯了

常見編碼錯誤的原因有以下這些:

Python解釋器的默認編碼

Python源文件文件編碼

Terminal使用的編碼

操作系統的語言設置

最后總結一下:

python3  文件默認編碼是utf-8 , 字符串編碼是 unicode

以utf-8 或者 gbk等編碼的代碼,加載到內存,會自動轉為unicode正常顯示。

python2  文件默認編碼是ascii , 字符串編碼也是 ascii , 如果文件頭聲明了是gbk,那字符串編碼就是gbk。

以utf-8 或者 gbk等編碼的代碼,加載到內存,并不會轉為unicode,編碼仍然是utf-8或者gbk等編碼。

總結

以上是生活随笔為你收集整理的python的unicode编码表_Python-编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。