python 基礎七 編碼問題

2021-08-20 22:41:19 字數 2535 閱讀 9339

一、什麼是字元編碼。

要徹底解決字元編碼的問題就不能不去了解到底什麼是字元編碼。計算機從本質上來說只認識二進位制中的0和1,可以說任何資料在計算機中實際的物理表現形式也就是0和1,如果你將硬碟拆開,你是看不到所謂的數字0和1的,你能看到的只是一塊光滑閃亮的磁碟,如果你用足夠大的放大鏡你就能看到磁碟的表面有著無數的凹凸不平的元件,凹下去的代表0,突出的代表1,這就是計算機用來表現二進位制的方式。

1.ascii

現在我們面臨了第乙個問題:如何讓人類語言,比如英文被計算機理解?我們以英文為例,英文中有英文本母(大小寫)、標點符號、特殊符號。如果我們將這些字母與符號給予固定的編號,然後將這些編號轉變為二進位制,那麼計算機明顯就能夠正確讀取這些符號,同時通過這些編號,計算機也能夠將二進位制轉化為編號對應的字元再顯示給人類去閱讀。由此產生了我們最熟知的ascii碼。ascii 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元。這樣在大部分情況下,英文與二進位制的轉換就變得容易多了。

2.gb2312

然而,雖然計算機是美國人發明的,但是全世界的人都在使用計算機。現在出現了另乙個問題:如何讓中文被計算機理解?這下麻煩了,中文不像拉丁語系是由固定的字母排列組成的。ascii 碼顯然沒辦法解決這個問題,為了解決這個問題中國國家標準總局2023年發布《資訊交換用漢字編碼字符集》提出了gb2312編碼,用於解決漢字處理的問題。2023年又頒布了《漢字編碼擴充套件規範》(gbk)。gbk與gb 2312—1980國家標準所對應的內碼標準相容,同時在字彙一級支援iso/iec10646—1和gb 13000—1的全部中、日、韓(cjk)漢字,共計20902字。這樣我們就解決了計算機處理漢字的問題了。

3.unicode

現在英文和中文問題被解決了,但新的問題又出現了。全球有那麼多的國家不僅有英文、中文還有阿拉伯語、西班牙語、日語、韓語等等。難不成每種語言都做一種編碼?基於這種情況一種新的編碼誕生了:unicode。unicode又被稱為統一碼、萬國碼;它為每種語言中的每個字元設定了統一並且唯一的二進位制編碼,以滿足跨語言、跨平台進行文字轉換、處理的要求。unicode支援歐洲、非洲、中東、亞洲(包括統一標準的東亞象形漢字和南韓表音文字)。這樣不管你使用的是英文或者中文,日語或者韓語,在unicode編碼中都有收錄,且對應唯一的二進位制編碼。這樣大家都開心了,只要大家都用unicode編碼,那就不存在這些轉碼的問題了,什麼樣的字元都能夠解析了。

4.utf-8

但是,由於unicode收錄了更多的字元,可想而知它的解析效率相比ascii碼和gb2312的速度要大大降低,而且由於unicode通過增加乙個高位元組對iso latin-1字符集進行擴充套件,當這些高位元組位為0時,低位元組就是iso latin-1字元。對可以用ascii表示的字元使用unicode並不高效,因為unicode比ascii占用大一倍的空間,而對ascii來說高位元組的0對他毫無用處。為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即utf(unicode transformation format)。而我們最常用的utf-8就是這些轉換格式中的一種。在這裡我們不去研究utf-8到底是如何提高效率的,你只需要知道他們之間的關係即可。

總結:

1.為了處理英文本元,產生了ascii碼。

2.為了處理中文字元,產生了gb2312。

3.為了處理各國字元,產生了unicode。

4.為了提高unicode儲存和傳輸效能,產生了utf-8,它是unicode的一種實現形式。

由於python3中的預設編碼是utf-8,所以在python3中輸入中文不需要新增字段:# -- coding: utf-8 --

# python2.x

import sys

print(sys.getdefaultencoding()) # ascii

# python3.x

import sys

print(sys.getdefaultencoding()) # utf-8

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

import sys

print(sys.getdefaultencoding())

s = "你好"

# >>>s

# '\xe4\xbd\xa0\xe5\xa5\xbd'

# 上述輸出的是位元組串

# 位元組串是指該字串在python中的標準形式,

# 也就是說無論乙個字串是什麼樣的編碼,

# 在python中都會有一串位元組串來進行表示。

# 位元組串是沒有編碼的,對應的是最終交給計算機處理的資料形式。

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

# >>>s_unicode

# u'\u4f60\u597d'

# 上述輸出的是位元組串

s_gbk = s_unicode.encode("gbk")

# >>>s_gbk

# '\xc4\xe3\xba\xc3'

# 上述輸出的是位元組串

Python編碼問題

tag python,encoding,unicode 現有的字元編碼 ascii,gbk,gb2312,utf 8,unicode.unicode可以用來表示所有語言的字元,而且是定長雙位元組 也有四位元組的 編碼,包括英文本母在內。python中定義乙個unicode字串和定義乙個普通字串一樣簡...

python編碼問題

python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...

Python編碼問題

python裡面基本上要考慮三種編碼格式 1 原始檔編碼 在檔案頭部使用coding宣告。告訴python直譯器該 檔案所使用的字符集。usr bin python coding utf8 2 內部編碼 檔案中的字串,經過decode以後,被轉換為統一的unicode格式的內部資料,類似於u uni...