1. 程式人生 > >Python中關於coding=utf-8以及中文字元前加u的解釋

Python中關於coding=utf-8以及中文字元前加u的解釋

寫了很久的Python了,每次寫之前都要在開頭加上coding=utf-8,只知道是設定編碼格式,但並沒有太在意,今天在寫socket程式設計時才發現編碼格式的重要性。

一、關於開頭coding=utf-8

開頭的coding=utf-8和coding:utf-8的作用是一樣的。

作用是宣告python程式碼的文字格式是utf-8,python按照utf-8的方式來讀取程式。

如果不加這個宣告,無論程式碼中還是註釋中有中文都會報錯。

以下幾種方式都可以:

注意一點無論中間是:還是=,其中coding與它們之間都不能有空格。否則也會報錯。

二、關於中文字元前面的u

加上u的作用是對後面的字串進行unicode編碼。unicode是書寫國際文字的標準方法,如果你想用你的母語來寫文字的時候,就需要一個支援unicode的編譯器,python允許處理Unicode文字,只需在字串前加上字首u即可。一般英文的字串不需要進行任何編碼的處理,但是當你使用中文的時候,就需要在前面加上u了。

再補充下utf-8、unicode以及其他編碼之間的關係:

  • Unicode 是字符集
  • UTF-8 是編碼規則
Unicode字符集的作用就是給每一個字元分配一個唯一的ID(又稱碼位)。

編碼規則是將碼位轉換為位元組序列的規則。

引用知乎上某個大佬舉的例子:https://www.zhihu.com/question/23374078/answer/65352538


舉一個例子:It's 知乎日報

你看到的unicode字符集是這樣的編碼表:
I 0049
t 0074
' 0027
s 0073
  0020
知 77e5
乎 4e4e
日 65e5
報 62a5

每一個字元對應一個十六進位制數字。

計算機只懂二進位制,因此,嚴格按照unicode的方式(UCS-2),應該這樣儲存:
I 00000000 01001001
t 00000000 01110100
' 00000000 00100111
s 00000000 01110011
  00000000 00100000
知 01110111 11100101
乎 01001110 01001110
日 01100101 11100101
報 01100010 10100101

這個字串總共佔用了18個位元組,但是對比中英文的二進位制碼,可以發現,英文前9位都是0!浪費啊,浪費硬碟,浪費流量。

怎麼辦?

UTF。

UTF-8是這樣做的:

1. 單位元組的字元,位元組的第一位設為0,對於英語文字,UTF-8碼只佔用一個位元組,和ASCII碼完全相同;

2. n個位元組的字元(n>1),第一個位元組的前n位設為1,第n+1位設為0,後面位元組的前兩位都設為10,這n個位元組的其餘空位填充該字元unicode碼,高位用0補足。

這樣就形成了如下的UTF-8標記位:

0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
... ...

於是,”It's 知乎日報“就變成了:
I 01001001
t 01110100
' 00100111
s 01110011
  00100000
知 11100111 10011111 10100101
乎 11100100 10111001 10001110
日 11100110 10010111 10100101
報 11100110 10001010 10100101

和上邊的方案對比一下,英文短了,每個中文字元卻多用了一個位元組。但是整個字串只用了17個位元組,比上邊的18個短了一點點。

另外一個漢字在UTF-8編碼的情況下可能需要三個位元組,而使用gbk兩個位元組就足夠了,所以有時候為了節省流量和硬碟,在使用中文的時候,也有用gbk或者gbk2312編碼的