python字符的編碼與解碼

2020-12-17 葉子陪你玩編程

什麼是字符編碼

計算機裡面是由各種電子電路組成的,它是如何識別我們的寫的字符的,比如hello ,你,我。

直接識別是不可能,它只能識別 二進位的0,1字符。所有我們輸入進去的字符,最終都會被轉化成0,1這種組合在一起的一串數字。

計算機存儲信息的最小單位,稱之為位(bit),又叫比特,二進位的一個「0」或一個「1」叫一位。

8個二進位位組成1個字節(Byte),1024位元組(Byte)也就是1KB,1024KB是1M,這就是我們平常說的文件大小的單位(M),比如這個圖片大小5M。

既然計算機是通過二進位的數字來識別不同字符的,那不同的字符該用多少個1和0,又該以什麼樣的順序來排列呢?

為什麼要字符編碼

這裡為了規範,就出現了ASCII編碼。ASCII ((American Standard Code for Information Interchange): 美國信息交換標準代碼)是基於拉丁字母的一套電腦編碼系統,主要用於顯示現代英語和其他西歐語言。

這裡的編碼規定了,每個字符由幾個0和1組成,順序也定下了。裡面包含了控制字符或通信專用字符,阿拉伯數字,大小寫英文字符,標點運算符號等,一共128個。

32~126(共95個)是字符(32是空格),其中48~57為0到9十個阿拉伯數字。65~90為26個大寫英文字母,97~122號為26個小寫英文字母,其餘為一些標點符號、運算符號等。

了解進位數

進位也就是進位計數制,是人為定義的帶進位的計數方法。對於任何一種進位---X進位,就表示每一位置上的數運算時都是逢X進一位。 十進位是逢十進一,十六進位是逢十六進一,二進位就是逢二進一,以此類推,x進位就是逢x進位。

下面就來通過python中自帶的函數一起來驗證一下。

理解:

ord() 函數:以一個字符串作為參數,返回對應的 ASCII 數值。

chr()函數:用一個整數作參數,返回一個對應的字符。可以二進位,十進位,十六進位。

不理解進位數的可以自己去學習一下,或者利用python自帶的進位轉換函數去試一下。

0b 開頭表示二進位,0o表示八進位,0x表示十六進位,通過內置進位函數可以想互進行轉換。

Hello這樣的一個詞語要被計算機認識,只要按照ASCII編碼來就可以了。 對應的16進位編碼是:48 65 6C 6C 6F

編碼的種類

百科知識:

在英語中,用128個符號編碼便可以表示所有,但是用來表示其他語言,128個符號是不夠的。比如,在法語中,字母上方有注音符號,它就無法用 ASCII 碼表示。於是,一些歐洲國家就決定,利用字節中閒置的最高位編入新的符號。比如,法語中的é的編碼為130(二進位10000010)。這樣一來,這些歐洲國家使用的編碼體系,可以表示最多256個符號 [5] 。

但是,這裡又出現了新的問題。不同的國家有不同的字母,因此,哪怕它們都使用256個符號的編碼方式,代表的字母卻不一樣。比如,130在法語編碼中代表了é,在希伯來語編碼中卻代表了字母Gimel (),在俄語編碼中又會代表另一個符號。但是不管怎樣,所有這些編碼方式中,0--127表示的符號是一樣的,不一樣的只是128--255的這一段 。

至於亞洲國家的文字,使用的符號就更多了,漢字就多達10萬左右。一個字節只能表示256種符號,肯定是不夠的,就必須使用多個字節表達一個符號。比如,簡體中文常見的編碼方式是 GB2312,使用兩個字節表示一個漢字,所以理論上最多可以表示 256 x 256 = 65536 個符號 。

因為ASCII不夠用了,所以需要擴展字符集。

百科知識2:

不同的國家和地區制定了不同的標準,由此產生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼標準。這些使用多個字節來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文Windows作業系統中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows作業系統中,ANSI編碼代表Big5;在日文Windows作業系統中,ANSI 編碼代表 Shift_JIS 編碼。 [1]

簡單的說,在簡體中文系統下,ANSI編碼代表GB2312編碼;在日文作業系統下,ANSI編碼代表JS編碼。 [2]

不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬於兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。ANSI編碼表示英文字符時用一個字節,表示中文用兩個或四個字節。

但是這麼多編碼,很混亂,不同 ANSI 編碼之間互不兼容,不同語言交流時會出現亂碼。為了統一所有文字的編碼,Unicode誕生了。Unicode把所有語言都統一到一套編碼裡,這樣就不會再有亂碼問題了。

雖然統一了所有字符,但是在存儲和傳輸的時候,也帶來了一些缺點,如果你傳輸的都是英文字符,使用unicode編碼就會使用更多的字節,所以後面實現了utf-8編碼,可以根據字符的情況進行可變的字節表示。

在文件保存的時候,其實是可以看見有編碼選擇的,平時可能不是很關注,讀寫文件出現編碼格式錯誤,就可以從這方面來思考解決。

編碼和解碼

utf編碼讀取文件

ANSI讀取文件/gbk

utf-8 帶 bom讀取

忽略錯誤會出現亂碼

使用utf-8-sig編碼可以解決這個問題

encode:將 Unicode 字符串轉換為特定編碼格式對應的字節碼的過程

decode:將特定編碼格式的字節碼轉換為對應的 Unicode 字符串的過程

Python3 的默認編碼為 Unicode。

編碼檢測

有時候解碼格式報錯,但是我們並不知道它是什麼編碼,那該怎樣解碼?可以通過chardet這個模塊來檢測我們文件數據的一個編碼格式,結果會顯示可信度。

python和scratch生成隨機不相同的十個數

python滑鼠連點器-測試版

python圖像處理-濾鏡處理

python圖像處理-個性化頭像

相關焦點

  • 【Python基礎】(6.1)字符編碼
    3.2 字符編碼表的發展史 (了解)3.3 編碼與解碼4.1 文本編輯器nodpad++存取文本文件 ✦ ✦ ✦ ✦ ✦ ✦一 引入    字符串類型、文本文件的內容都是由字符組成的,但凡涉及到字符的存取,都需要考慮字符編碼的問題。
  • Python 2.x 字符編碼終極指南
    至於什麼是 ASCII,UTF-8等,在人機互動之字符編碼 中有詳細的說明,這裡不再贅述。下面結合具體的例子,來看看編碼、解碼的細節問題。python2.x 中的字符串在程序設計中,字符串一般是指一連串的字符,比如hello world!、你好或者もしもし(日語)等等。
  • 給妹子講python-S01E08理清python中的字符編碼方法
    容器遍歷和列表解析式給妹子講python-S01E05字符串的基本用法給妹子講python-S01E06字符串用法進階給妹子講python-S01E07字符編碼歷史觀:從ASCII到Unicode【要點搶先看】1.python中編、解碼的本質是文本字符串和字節字符串的相互轉換
  • python入門教程06-01(python語法入門之字符編碼)
    python代碼寫的啥,而是為了執行python代碼、會識別python語法)三、字符編碼介紹3.1 什麼是字符編碼?格式的數字3.3 編碼與解碼由字符轉換成內存中的unicode,以及由unicode轉換成其他編碼的過程,都稱為編碼encode由內存中的unicode轉換成字符,以及由其他編碼轉換成unicode的過程,都稱為解碼decode在諸多文件類型中,只有文本文件的內存是由字符組成的,因而文本文件的存取也涉及到字符編碼的問題3.4 utf
  • python如何編碼解碼解析json對象
    前言json是一種以鍵值對形式存在的輕量級的數據結構,和python中的字典類型具有相同的表現結構。使用 JSON 函數需要導入 json 庫:import json。在Java中我們知道json有jsonObject和jsonArray,且可以通過String、map等相互轉換,那麼在python中,json對象是如何來讀取解析的呢?python解析json對象1.json.dumpsjson.dumps用於將 Python 對象編碼成 JSON 字符串。
  • 給妹子講python-S01E07字符編碼歷史觀:從ASCII到Unicode
    容器遍歷和列表解析式給妹子講python-S01E05字符串的基本用法給妹子講python-S01E06字符串用法進階【要點搶先看】1.字符編碼與解碼的概念2.ASCII編碼到Unicode編碼的發展過程3.容易混淆的字符編碼與字符代碼【妹子說】上兩集基本上讓我們熟悉了字符串的常見用法
  • Python中常用的字符編碼,編碼解碼之間的轉換
    UnicodeUnicode(統一碼、萬國碼、單一碼)是計算機科學領域裡的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一併且唯一的二進位編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。
  • Python3 是如何解決棘手的字符編碼問題的?
    已經介紹過 Python2 字符串設計上的一些缺陷:當然這並不算 Bug,只要處理的時候多留心也可以避免這些坑。但在 Python3 兩個問題都很好的解決了。>>> b"a"+b"c"b'ac'>>> b"a"*2b'aa'>>> b"abcdef\xd6"[1:]b'bcdef\xd6'>>> b"abcdef\xd6"[-1]214>>> b"a" + "b"Traceback (most recent call last):  File "<
  • python編解碼問題詳解
    Unicode編碼這是一種世界上所有字符的編碼,但是它沒有規定的存儲方式。Unicode標準也在不斷發展,但最常用的是用兩個字節表示一個字符(如果要用到非常偏僻的字符,就需要4個字節)。現代作業系統和大多數程式語言都直接支持Unicode。
  • Python 編碼為什麼那麼蛋疼?
    作者:劉志軍,6年+Python使用經驗, 高級開發工程師,目前在網際網路醫療行業從事Web系統構架工作個人公眾號:Python
  • Python 編碼錯誤的本質原因
    字符碼字符碼(Code Point)指的是字符集中每個字符的數字編號,例如 ASCII 字符集用 0-127 連續的128個數字分別表示128個字符,例如 「A」 的字符碼編號就是65。默認是使用 ascii 編碼進行 decode 和 encode 操作,例如:CASE 1>>> s = '你好'>>> s.decode()Traceback (most recent call last):  File "<stdin>", line
  • 編碼解碼是什麼意思?URL 如何編碼解碼?為什麼要編碼?
    編碼解碼是什麼?編碼是信息從一種形式或格式轉換為另一種形式的過程,也稱為計算機程式語言的代碼簡稱編碼。用預先規定的方法將文字、數字或其它對象編成數碼,或將信息、數據轉換成規定的電脈衝信號。編碼在電子計算機、電視、遙控和通訊等方面廣泛使用。編碼是信息從一種形式或格式轉換為另一種形式的過程。解碼,是編碼的逆過程。
  • 令人頭疼的Python編碼問題
    或者是列印一串字符串,確是亂碼,搞人心態。別慌,本文將從編碼的前世今生講解,讓你對編碼有個深刻了解,以便後期對Python編碼問題進行分析和解決。字符編碼的前世今生大家都知道,電腦本身是不認識字符的,只認識0和1。
  • python爬蟲小知識,中文在url中的編碼解碼
    有時候我們做爬蟲經常會遇到這種編碼格式,大概的樣式為 %xx%xx%xx,對於這部分編碼,python提供了一個quote的方法來編碼,對應的解碼為unquote方法。導入quote方法是urllib庫的一個方法,它的導入方式為from urllib.parse import quote,unquote不需要安裝,urllib庫是python自帶的一個庫,直接導入就可以使用。
  • python 輸出編碼錯誤問題
    /usr/bin/python#-*-coding:utf-8 -*-a={'name': 'fengshou'}b={'name': '豐收'}原因:這是因為win的,命令行用的是cp936編碼,而上面腳本用的是utf-8編碼,因此導致亂碼。解決方法是,使用decode和encode函數對字符重新解碼和編碼。
  • Python中字符串編碼在二進位之間相互轉換的方法
    第八十節:字符串編碼轉換在學習「計算字符串的長度」(詳見第72節內容str表示Unicode字符,就是包括ASCII碼、utf-8碼、GBK碼、GB2312碼之類的編碼;bytes表示的則是二進位數據,其中包括了編碼的文本。
  • Python高效編程之88條軍規(1):編碼規範、字節序列與字符串
    關於PEP 8的詳細內容,讀者可以查看下面的頁面:https://www.python.org/dev/peps/pep-0008/在Python語言中,空格是有實際意義的。編碼,這些編碼表示人類語言的文本字符:a = 'a\u0300 propos'print(list(a))print(a)['a', '̀', ' ', 'p', 'r', 'o', 'p', 'o', 's']à propos值得注意的是,字符串並不包含與之關聯的二進位編碼,
  • Python基礎:數據類型和變量&字符串和編碼
    Python基礎:2.字符串和編碼字符編碼我們已經講過了,字符串也是一種數據類型,但是,字符串比較特殊的是還有一個編碼問題。因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。所以,本著節約的精神,又出現了把Unicode編碼轉化為「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不同的數字大小編碼成1-6個字節,常用的英文字母被編碼成1個字節,漢字通常是3個字節,只有很生僻的字符才會被編碼成4-6個字節。
  • 如何正確解決Python中的中文編碼問題?
    編程派微信號:codingpy作者:xianglong原文連結:http://xianglong.me/article/learn-python-1-chinese-encoding/字符串是Python中最常用的數據類型,而且很多時候你會用到一些不屬於標準ASCII字符集的字符,這時候代碼就很可能拋出UnicodeDecodeError:
  • 我的 Python 編碼規範
    /usr/bin/env python# -*- coding: utf-8 -*-"""通常這裡是關於本文檔的說明(docstring),須以半角的句號、 問號或驚嘆號結尾!解釋器聲明編碼格式聲明模塊注釋或文檔字符串模塊導入常量和全局變量聲明頂級定義(函數或類定義)執行代碼編碼格式聲明通常,編碼格式聲明是必需的。