1. 程式人生 > >關於python編碼,你真的明白了嗎

關於python編碼,你真的明白了嗎

想要徹底搞清楚編碼問題,我們必須要先搞清楚計算機是怎麼儲存資料的,這就涉及到了計算機基礎的幾個概念了,開篇我們就先來捋捋這幾個容易混淆的概念。

bit

二進位制位, 是計算機內部資料儲存的最小單位,11010100是一個8位二進位制數。一個二進位制位只可以表示0和1兩種狀態(2^1);兩個二進位制位可以表示00、01、10、11四種(2^2)狀態;三位二進位制數可表示八種狀態(2^3)……

Byte

位元組,是計算機中資料處理的基本單位,計算機中以位元組為單位儲存和解釋資訊,規定一個位元組由八個二進位制位構成,即1個位元組等於8個位元(1Byte=8bit)。八位二進位制數最小為00000000,最大為11111111;通常1個位元組可以存入一個ASCII碼,2個位元組可以存放一個漢字國標碼。

在計算機中,一串數碼作為一個整體來處理或運算的,稱為一個計算機字,簡稱宇。字通常分為若干個位元組(每個位元組一般是8位)。在儲存器中,通常每個單元儲存一個字,因此每個字都是可以定址的。字的長度用位數來表示。在計算機的運算器、控制器中,通常都是以字為單位進行傳送的。

字長

字長:電腦技術中對CPU在單位時間內(同一時間)能一次處理的二進位制數的位數叫字長。所以能處理字長為8位資料的CPU通常就叫8位的CPU。同理32位的CPU就能在單位時間內處理字長為32位的二進位制資料。

位元組和字長的區別:由於常用的英文字元用8位二進位制就可以表示,所以通常就將8位稱為一個位元組。字長的長度是不固定的,對於不同的CPU、字長的長度也不一樣。8位的CPU一次只能處理一個位元組,而32位的CPU一次就能處理4個位元組,同理字長為64位的CPU一次可以處理8個位元組。

常見的編碼

ASCII: 1個位元組,只編碼英文字母和符號

gb2312: 2個位元組,增加了中文漢字和符號

Unicode: 把所有語言都統一到一套編碼裡把所有語言都統一到一套編碼裡,
一般是2個位元組,生僻字4個位元組

utf-8: 可變長編碼,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文字包含大量英文字元,用UTF-8編碼就能節省空間:

在計算機記憶體中,統一使用Unicode編碼,當需要儲存到硬碟或者需要傳輸的時候,就轉換為UTF-8編碼,這樣可以節省很多儲存空間。

Python編碼

注:這裡討論的是python2.7的情況

兩個函式

在python中,str和unicode都是basestring的子類,basestring有以下兩個方法:

encode(): 將unicode字串轉換為其他編碼字串,引數為轉換後編碼

decode(): 將其他編碼轉換為unicode字串,引數為轉換前編碼

PS:"string".decode('utf-8') == unicode('string', 'utf-8')

一個栗子

123456789 s='中文'print type(s),len(s)u=u'中文'print type(u),len(u)u2s=u'中文'.encode('utf-8')print type(u2s),len(u2s)

結果是這樣的

Python
123 <type'str'>6<type'unicode'>2<type'str'>6

console下檢視u2s

Python
12 >>>u'中文'.encode('utf-8')'\xe4\xb8\xad\xe6\x96\x87'

結論:

  • python中定義的一個str變數實則是位元組串,由Unicode經過編碼(encode)後的位元組組成的(
    也正好印證了utf8編碼中一箇中文字元是3個位元組)
  • Unicode才是真正意義上的字串,由字元組成

再次回顧兩個函式用法

Python
12345678910 s='中文'# 這時是str,轉為unicode需要用decodeu=s.decode('utf-8')printtype(u)# 列印 <type 'unicode'># unicode轉為str ,使用encodes2=u.encode('utf-8')printtype(s2)# 列印 <type 'str'>

新結論:不同編碼轉換,使用Unicode作為中間編碼

12 #s是code_A的strs.decode('code_A').encode('code_B')

在Python 3.x版本中,把'xxx'u'xxx'已經都統一成Unicode編碼了,即寫不寫字首u都是一樣的,而以位元組形式表示的字串則必須加上b字首:b'xxx'

由於Python原始碼也是一個文字檔案,所以,當你的原始碼中包含中文的時候,在儲存原始碼時,就需要務必指定儲存為UTF-8編碼。當Python直譯器讀取原始碼時,為了讓它按UTF-8編碼讀取,我們通常在檔案開頭寫上這兩行:

12 #!/usr/bin/env python# -*- coding: utf-8 -*-

參考

相關推薦

關於python編碼真的明白

想要徹底搞清楚編碼問題,我們必須要先搞清楚計算機是怎麼儲存資料的,這就涉及到了計算機基礎的幾個概念了,開篇我們就先來捋捋這幾個容易混淆的概念。 bit 二進位制位, 是計算機內部資料儲存的最小單位,11010100是一個8位二進位制數。一個二進位制位只可以表示0和1兩種狀態(2^1);兩個二進位制位可以表示

C語言/原子/編譯真的明白

clas done ati pre 內存 程序 導致 裏的 creat   說到原子,類似於以下的代碼可能人人都可以看出貓膩。 #include <stdio.h> #include <pthread.h> int cnt = 0;

python小白也可以分分鐘爬取微博數據並生成有個性的詞雲get到

python 爬蟲 web開發 編程Python(發音:英[?pa?θ?n],美[?pa?θɑ:n]),是一種面向對象、直譯式電腦編程語言,也是一種功能強大的通用型語言,已經具有近二十年的發展歷史,成熟且穩定。它包含了一組完善而且容易理解的標準庫,能夠輕松完成很多常見的任務。它的語法非常簡捷和清晰,與其它大多

系統地自學 好Python真的會?自學python步驟和知識點

自的同學的是非常想學好 Python的,想在有一技能生活或著興趣。一方面被七七八八的瑣事糾纏,一直沒能動手,另一方面,擔心學習的費用高,心裡默默敲著退堂鼓? 那恭喜您有幸的看到了這篇文章,Python 是一門對初學者程式語言,想要完全掌握它,你不要花上太多的時間和精力。甚至短時間內就能學會,

Python面試基礎題十大陷阱中招

我們在會碰到各種各樣的面試,有的甚至是HR專門為你設定的障礙,在python面試中也是,無論你是應聘Python web開發,爬蟲工程師,或是資料分析,還是自動化運維,這些python面試基礎題十大陷阱也許你會遇到,今天的python培訓總結出來給你以防萬一,收好不謝!問題1

VR禁毒體驗試過

研發 img 成了 此舉 pict clas bsp 廣州 嘗試 VR禁毒體驗,你試過了嗎? 大家先來跟著小編的文字,嘗試冥想一下——當你正處於寧靜的情緒中,對於顏色感覺生動、豐富而深刻,感到周圍事物絢麗多彩,五光十色;對音樂的鑒賞能力增強,對其他聲音也很敏感。然後,感到時

【項目管理】經驗之談 | 資深項目經理都避免的5個坑中招

尊重 最終 fail 同方 快速 這就是 tro 理解 動力 哈嘍!大家好! 那天看到最有趣的一句話就是 為了填坑,一位項目經理胖了20斤 。。。。。 今天就給大家介紹一下 項目經理要註意的那些“坑” 項目經理“誤踩雷區” 1 未告知成員工作目標 作為項目經理

身份證掃描識別/身份證OCR識別的正確姿勢get到

視頻流 開發包 掃描識別 出錯 應用 左右 信息 設備 ucs 自從國家規定電信實名制之後,實名制已經推廣到各個領域:辦理通信業務需要實名制、銀行開戶需要實名制、移動支付需要實名制,就連註冊個自媒體賬戶都需要實名制。 而實名制的背後,就是身份證信息的采集和錄入驗證。 傳統的

IT輪子系列(六)——Excel上傳與解析一套代碼解決所有Excel業務上傳Get到

tryparse mappath src 個推 列名 import ges bject tab 前言 在日常開發當中,excel的上傳與解析是很常見的。根據業務不同,解析的數據模型也都不一樣。不同的數據模型也就需要不同的校驗邏輯,這往往需要寫多套的代碼進行字段的檢驗,如必填

柯夢嬌:3.5非農強勢來襲準備好

均線 黃金 有效 走勢分析 body 現象 線圖 盈利 交易 柯夢嬌:3.5非農強勢來襲,你準備好了嗎? 就像貝利的烏鴉嘴一樣,資本市場常有些令人訝異的“規律”,比如期指“逢9必跌”、原油市場“7月必跌”等等。如今,在黃金市場上,也出現了這一種詭異的現象——周五總是

共享人才時代已經到來做好準備

共享共享經濟是一種全新的經濟模式,近幾年得到了突飛猛進的發展。其本質是整合線下的閑散物品或服務者,讓他們提供產品或服務。在共享過程中,供給方通過在特定時間內提供使用權或服務獲得酬勞,需求方雖無所有權但在特定使用權內滿足了需要。 人才是決定企業成敗的關鍵性因素之一。共享人才做為一種新生的力量,在互聯網大環境中扮

記一次安裝多版本php的四個雷區踩著

path start cgi 命令執行 mysq -c tool port 一鍵 記一次安裝多版本的php的四個雷區,你踩著了嗎 需求:公司需要在同一臺服務器上安裝不同版本的php,而這一臺的服務上已經安裝了php.7.1,現需要同

逸管家:共享人才時代已經到來做好準備

特定 正常 之間 結束 銷售 相關 不可 人的 十分 ?  共享人才時代已經到來,你做好準備了嗎? 共享經濟是一種全新的經濟模式,近幾年得到了突飛猛進的發展。其本質是整合線下的閑散物品或服務者,讓他們提供產品或服務。   在共享過程中,供給方通過在特定時間內提供使用權或服務

初學C語言編程時最容易犯的錯誤踩坑

不同的 類型 alt 結果 如何 wid text size can C編譯的程序對語法檢查並不像其它高級語言那麽嚴格,這就給編程人員留下“靈活的余地”,但還是由於這個靈活給程序的調試帶來了許多不便,尤其對初學C語言的人來說,經常會出一些連自己都不知道錯在哪裏的錯誤。看著有

HTTPS時代已來做好準備

兩種方法 運營商 增長 images 同步 有效期 很多 取證 錯誤類型 摘要: 全站HTTPS時代的到來,這也是最近越來越多的網站上HTTPS和更換證書的原因。那麽究竟什麽是HTTPS?它為什麽會提升安全系數?CDN HTTPS又將如何做到安全性與性能同時提升?作為用戶,

補習系列(9)-springboot 定時器用對

empty cront apps 任務並發 轉發 gis execute 大小 定義 目錄 簡介 一、應用啟動任務 二、JDK 自帶調度線程池 三、@Scheduled 定制 @Scheduled 線程池 四、@Async 定制 @Async 線程池 小結 簡介 大

學習程式設計的25個“坑”踩到

0、忽視了程式設計終究是以人為本的。是的,機器的確會執行你的程式碼,但程式設計是為人們解決問題的,將他們的需求轉換為由其他人(或你自己線下)讀取,維護和修改的程式碼。 1、未能花充足的時間練習程式設計。 根據工作或日程安排,你可能會花費大量時間在與程式設計相關的任務上,但實際上這些並非程式設計本

深挖價值讓資料“說話”準備好

隨著AI技術的深入發展,近幾年來與企業級資料相關的討論層出不窮。 如何儲存?怎樣呼叫?呼叫的時候又該如何確保隱私不被洩露? …… 儘管資料專家一波接著一波,但針對企業如何理解、儲存、使用資料,並通過其實現更大商業價值的探索從未改變。 對此,百度雲早就get到了開發者們的資料痛點。

面試中常問的List去重問題都答對

面試中經常被問到的list如何去重,用來考察你對list資料結構,以及相關方法的掌握,體現你的java基礎學的是否牢固。 我們大家都知道,set集合的特點就是沒有重複的元素。如果集合中的資料型別是基本資料型別,可以直接將list集合轉換成set,就會自動去除重複的元素,這個就相對比較簡單。

對可用性測試的8種誤解中槍

使用者測試是理解使用者行為和動機的過程。 好的設計能讓使用者輕鬆找到想看的, 輕鬆做到想做的。   然而很多時候, 由於時間和預算的限制, 使用者測試被邊緣化、 甚至直接被略過了。 究其根本, 還是在於使用者測試的價值被誤解和低估了。   蜜汁誤解1