《Fluent Python》讀書筆記-Text versus Bytes

概覽

????"string"的概念很簡單鹿鳖,就是字符的序列俄讹。但是怎么定義字符是一個問題篮洁。在python3帽芽,str是由Unicode字符組成删掀,而在python2里str是由原始的byte字符組成。
????Unicode標準把字符的標識和字符的二進制表示區(qū)分開來:

  • 字符的標識导街,即碼位(code point)披泪,是一個從0到1,114,111的數(shù)字,在Unicode標準里是以U+為前綴的4到6位的16進制數(shù)字搬瑰。如字母A的碼位是U+0041款票。
  • 實際的一個字符的二進制表示是由具體使用的編碼(encoding)決定。如字母A在UTF-8編碼里是單個字節(jié)\x41而在UTF-16LE編碼下是兩個字節(jié)\x41\x00泽论。
    ????從碼位轉(zhuǎn)換字節(jié)是encoding艾少,從字節(jié)轉(zhuǎn)換到碼位是decoding。

字符編碼的各式各樣的問題

????本章后面講了很多因為字符編碼產(chǎn)生的問題佩厚,在目前做過的項目中基本沒碰到過姆钉,感覺主要出現(xiàn)在像希臘語,葡萄牙語還有泰米爾語這類語言上,也沒去深入研究潮瓶,簡單做下總結(jié)陶冷。

  • 有些編碼包含的字符只是Unicode的一個子集,當把一個Unicode字符轉(zhuǎn)換到目標編碼時毯辅,如果目標編碼不包含這個字符的定義埂伦,則會報UnicodeEncodeError,可以通過在encode方法中加入error參數(shù)思恐,對錯誤進行忽略或者做一些處理沾谜。
  • 如果二進制編碼有錯,不是一個有效的編碼胀莹,則在把二進制編碼轉(zhuǎn)換到Unicode字符時基跑,會報UnicodeDecodeError,也可以通過在decode方法中加入error參數(shù)描焰,對錯誤進行忽略或者做一些處理媳否。
  • 從python3開始,源碼的默認編碼采用UTF-8荆秦,而python2的默認編碼是ASCII篱竭,意味著#!coding: utf8不需要再加了。
  • 作者討論了下是不是能從二進制序列里發(fā)現(xiàn)編碼方式步绸,答案是不可以掺逼。但是可以通過一些特殊的規(guī)則大概確定一下,作者介紹了個chardet的項目瓤介。
  • BOM是用來標識大端序和小端序的吕喘,對于UTF-16是需要的,但是對于UTF-8不是必須的惑朦,python沒有使用BOM來判斷一個文件是否是UTF-8兽泄。
  • 如果使用python默認的編碼漓概,可能會出問題漾月,比如用UTF-8編碼寫一個文件,但是讀的時候沒指定編碼胃珍,在Linux上沒問題梁肿,但是可能在Windows上就有問題。最好是在所有的操作上都明確指定編碼格式觅彰。
  • 因為組合字符的原因吩蔑,字符串比較會有些問題,打印出來是一樣的字符填抬,可能實際的編碼不一樣烛芬,python提供了一些normalize方法進行歸一化,不過作者也提到像google就是直接把這些變音符給去掉。
  • 在字符串排序時有可能也會出現(xiàn)問題赘娄,作者推薦了個PyUCA仆潮。
  • python中有一個完整的Unicode database,記錄了每個字符的各方面的信息遣臼。
  • python的接口可以支持str和bytes的輸入?yún)?shù)性置,但是根據(jù)參數(shù)類型不同,結(jié)果也不同揍堰。
  • python提供了struct模塊去對打包在一起的bytes進行拆包鹏浅。
>>> import struct
>>> fmt = '<3s3sHH' #
>>> with open('filter.gif', 'rb') as fp: ... img = memoryview(fp.read()) # ...
>>> header = img[:10] #
>>> bytes(header) # b'GIF89a+\x02\xe6\x00'
>>> struct.unpack(fmt, header) # (b'GIF', b'89a', 555, 230)
>>> del header #
>>> del img
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屏歹,隨后出現(xiàn)的幾起案子隐砸,更是在濱河造成了極大的恐慌,老刑警劉巖蝙眶,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凰萨,死亡現(xiàn)場離奇詭異,居然都是意外死亡械馆,警方通過查閱死者的電腦和手機胖眷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霹崎,“玉大人珊搀,你說我怎么就攤上這事∥补剑” “怎么了境析?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長派诬。 經(jīng)常有香客問我劳淆,道長,這世上最難降的妖魔是什么默赂? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任沛鸵,我火速辦了婚禮,結(jié)果婚禮上缆八,老公的妹妹穿的比我還像新娘曲掰。我一直安慰自己,他們只是感情好奈辰,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布栏妖。 她就那樣靜靜地躺著,像睡著了一般奖恰。 火紅的嫁衣襯著肌膚如雪吊趾。 梳的紋絲不亂的頭發(fā)上宛裕,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天,我揣著相機與錄音论泛,去河邊找鬼续滋。 笑死,一個胖子當著我的面吹牛孵奶,可吹牛的內(nèi)容都是我干的疲酌。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼了袁,長吁一口氣:“原來是場噩夢啊……” “哼朗恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起载绿,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤粥诫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后崭庸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀浆,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年怕享,在試婚紗的時候發(fā)現(xiàn)自己被綠了执赡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡函筋,死狀恐怖沙合,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跌帐,我是刑警寧澤首懈,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站谨敛,受9級特大地震影響究履,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜脸狸,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一最仑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肥惭,春花似錦盯仪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耀石。三九已至牵囤,卻和暖如春爸黄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背揭鳞。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工炕贵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人野崇。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓称开,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乓梨。 傳聞我的和親對象是個殘疾皇子鳖轰,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容