概述
最近工作中的專案同時使用到了 python2 和 python3 ,遇到了文字和位元組方面的 tricks,自己之前對這方面不太了解,學習並總結一下。
編碼介紹
unicode 標準
unicode 是用於表示文字以供計算機進行處理的通用字元編碼標準。unicode 標準提供了一種對多語種純文字進行一致編碼的方法,便於國際文字檔案的交換。
字元 的最佳定義是 unicode 字元 。unicode 只是乙個符號集,它只規定了符號的二進位制**,並沒有規定這個二進位制**應該如何儲存。
utf-8
utf-8 字元編碼是 unicode 的實現方式之一。
utf-8 是一種變長的編碼方式,它可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度。
python 中的文字和位元組
python3 中從 str 物件中獲取的元素就是 unicode 字元,可以通過 編碼 (encode) 將 文字 轉化為 位元組。
然而 python2 中從 str 物件中獲取的元素是位元組序列,只有通過 解碼 (decode) 才能將 位元組 轉化為 文字 。
下面使用兩個版本的 python 對字串進行操作以作解釋:
# py3
>>> s = '123'
>>> type(s)
# 文字
>>> b = s.encode('utf-8')
>>> b
b'123'
>>> type(b)
# 位元組序列
# py2
>>> s = '123'
>>> type(s)
# 這裡是位元組序列
>>> b = s.encode('utf-8')
>>> b
'123'
>>> type(b)
# 這裡還是位元組序列
>>> b.decode() # decode 出來的才是文字
u'123'
>>> type(b.decode())
# 文字
>>> c = '一二三'
>>> c
'\xe4\xb8\x80\xe4\xba\x8c\xe4\xb8\x89' # 位元組序列
從上面的兩個**片段可以總結出 python2 和 python3 對於字串處理上的區別:
python 中的 u, b, r
python 的字串有時候前面會加乙個 u ,r 或者 b ,其含義如下:
u :表示字串中的元素是 unicode 字元。結合上面**的結論,可以認為:在 python3 中,字串前面是否加 u 的效果是一致的。在 python2 中,字串前面加 u 表示其中的元素是 unicode 字元,不加 u 表示 bytes。
b :表示字串中的元素是 bytes。同結合上面**的結論,可以認為:在 python2 中,字串前面是否加 b 的效果是一致的。在 python3 中,字串前面加 b 表示其中的元素是 bytes,不加 b 表示 unicode 字元。
r :表示字串是 原始字串(raw string) ,裡面的字元都是 raw string literals ,與 unicode 和 bytes 無關,因此 python2 和 python3 中含義是一致的。它的作用是使直譯器不會對諸如 \n, \t 等轉義字元進行轉義:
# py3
>>> s1 = '123\n123\t123'
>>> s1
'123\n123\t123'
>>> s2 = r'123\n123\t123'
>>> s2
'123\\n123\\t123' # 不轉義
python2 和 python3 在字串處理方面的相容
既然 python2 和 python3 在字串的處理方面有所不同,但是實際工作中卻需要寫出相容兩種版本的**,那麼應該如何處理呢?
我的做法是使用 __future__ 模組:
from __future__ import unicode_literals
該模組的作用是將 python2 的字串字面量的型別變為文字,而不是位元組,因此與 python3 是一樣的。
舉個栗子:
# py2
>>> from __future__ import unicode_literals
>>> s = '123'
>>> s
u'123'
>>> type(s)
# 文字
>>> b = b'123'
>>> b
'123'
>>> type(b)
# 位元組
總結目前 python2 與 python3 是並存的,因此在編寫**過程中需要注意其中的差異和相容性,不然就要出鍋了hhh,別問我為什麼這麼說 quq(雖然 python2 在 2020 年 1 月就要停止維護了)。
參考
設定靜態文字字型
在對話方塊中加入乙個靜態文字,注意,修改其id號,不要採用預設的id號 通過嚮導給該靜態文字對映乙個cstatic型的成員變數 cstatic m captionctrl 在對話方塊類中加入乙個成員變數 cfont m font 在oninitdialog 中寫下 m font.createfont...
css背景,文字,字型
一 背景 1.background color,為元素設定背景色。p 預設為透明也可以用 00000十六進製制還可以用rgb來表示。2.background image,背景預設null,body.可以將背景放在任意位置。3.background repeat,背景重複 平鋪,body.引數分別為 ...
Css顏色和文字字型
顏色名表示,比如 red 紅色,gold 金色 16進製制數值表示,比如 ff0000 表示紅色,這種可以簡寫成 f00 rgb顏色 紅 r 綠 g 藍 b 三個顏色通道的變化 background color rgb 200,100,0 rgba顏色 紅 r 綠 g 藍 b 透明度 a backg...