亂碼問題原因分析

自己經(jīng)常在Linux和Windows下使用各種各樣的軟件棍辕,經(jīng)常遇到的亂碼的問題锯岖。

之前的對策是google XX軟件 亂碼 得到的結(jié)果往往是這樣子的

Step1... Step2... Step3... ....

于是自己也跟著做,有時能成功,但有時依然亂碼,只好放棄使用這個軟件脖母。

我想我的問題一直不知道為什么會出現(xiàn)亂碼,當(dāng)然闲孤,并不是完全不知谆级,說起編碼,也能說出個一二三來崭放,什么unicode, utf-8, 轉(zhuǎn)換編碼之類的哨苛。但自己并沒有一個清晰的概念。所以一直出問題币砂,也不知道問題的根源在哪里建峭。所以出了問題,解決問題的方式只能上網(wǎng)搜索决摧,純屬碰運氣亿蒸。

直到前一段時間讀到The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets這篇文章,發(fā)現(xiàn)自己有了那么一點點清晰的概念掌桩,之后在學(xué)Python Module of the Week中的編碼時边锁,仔細思考了一下,總算把亂碼產(chǎn)生的原因想的大概明白了波岛。

其實茅坛,說起來很簡單,對于文本來說则拷,主要有兩種操作

  1. 將文本寫入文件
  2. 從文件中讀取

其中如果寫入文件時和讀取文件時使用的編碼不一樣贡蓖,則可能會產(chǎn)生亂碼,到這里似乎還很簡單煌茬。

一般情形是這樣子的斥铺,使用一個文件編輯器編輯一個文件,然后保存坛善,保存的時候選取某一種編碼晾蜘,這一過程對應(yīng) 1. 寫入文件時的編碼

讀取文件時眠屎,往往使用文本編輯器打開一個文件剔交,如果此時文本編輯器設(shè)定的編碼方式與文件保存時使用的編碼方式一樣,那么顯示的時候就不會有亂碼改衩,如果不一樣岖常,則可能產(chǎn)生亂碼(如果保存時使用的編碼是顯示時設(shè)置的編碼的子集,一般會正常顯示)燎字。這一過程對應(yīng) 2. 從文件中讀取 腥椒。

由以上可以看的出來,使用文本編輯器保存時是寫入候衍,使用文本編輯器打開文件時是讀取笼蛛。這種情況很簡單。

但是蛉鹿, 寫入文件讀取文件 并非只有以上這種方式滨砍,而且 文件 也有可能不是通常所見到的那種。

寫入文件 還可以是使用程序來生成一個文件妖异,如

with codecs.open(filename, mode='w', encoding=encoding) as f:
    f.write(u'pi: \u03c0')

以上Python代碼惋戏,這時,就要在代碼中設(shè)置寫入時的編碼方式他膳。這個還只是寫入到普通文件响逢。如果是程序員,應(yīng)該還知道有一種文件叫做 標(biāo)準(zhǔn)輸出文件 而這種文件并不一定是傳統(tǒng)意義上的文件棕孙。而且舔亭,這里有一個比較容易誤解

標(biāo)準(zhǔn)輸出文件就是控制終端

其實,標(biāo)準(zhǔn)輸出文件并不一定是控制終端蟀俊,只不過常常和控制終端相連接钦铺,所以才有此誤解。

好肢预,現(xiàn)在的最復(fù)雜的情況是在程序中寫內(nèi)容到標(biāo)準(zhǔn)輸出文件需要指定編碼矛洞。

接下來的問題是,既然內(nèi)容按照一定的編碼寫到了標(biāo)準(zhǔn)輸出烫映,這是一個寫文件的過程沼本,那么讀文件呢?

以下討論兩種情況窑邦。

  1. 標(biāo)準(zhǔn)輸出與終端連接:標(biāo)準(zhǔn)輸出往往與終端連接擅威,將內(nèi)容顯示在終端上,這里其實已經(jīng)有了一個讀文件的過程冈钦。在傳統(tǒng)的讀文件過程中郊丛,有一個文本編輯器,有一個打開文件的過程瞧筛,但這里標(biāo)準(zhǔn)輸出文件并不是一個可以看的見的實體厉熟。而這個過程中,文本編輯器又在哪里呢较幌?呵呵揍瑟,這里 充當(dāng)文本編輯器角色的正是終端 。 所以通常所說的設(shè)置終端的編碼就如同使用設(shè)置文本編輯器的編碼一樣乍炉。
  2. 標(biāo)準(zhǔn)輸出與管道連接:這里負責(zé) 讀文件 的是管道之后的程序绢片。所以這里需要設(shè)置管道之后的程序中讀文件所使用的編碼滤馍。具體例子見PyMOTW中的codecs_stdin.py

其實要想搞清整個過程,有三個關(guān)鍵點最重要

  1. 寫入過程指的是什么底循?
  2. 讀出過程指的是什么巢株?
  3. 文件又指的是什么?

涉及文本操作的均離不開以上三個部分熙涤,分析一個文本操作阁苞,找出以上三個部分的答案,讓寫入過程和讀出過程的編碼一致祠挫,就能解決亂碼問題了那槽。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市等舔,隨后出現(xiàn)的幾起案子骚灸,更是在濱河造成了極大的恐慌,老刑警劉巖慌植,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逢唤,死亡現(xiàn)場離奇詭異,居然都是意外死亡涤浇,警方通過查閱死者的電腦和手機鳖藕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來只锭,“玉大人著恩,你說我怎么就攤上這事◎哒梗” “怎么了喉誊?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纵顾。 經(jīng)常有香客問我伍茄,道長,這世上最難降的妖魔是什么施逾? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任敷矫,我火速辦了婚禮,結(jié)果婚禮上汉额,老公的妹妹穿的比我還像新娘曹仗。我一直安慰自己,他們只是感情好蠕搜,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布怎茫。 她就那樣靜靜地躺著,像睡著了一般妓灌。 火紅的嫁衣襯著肌膚如雪轨蛤。 梳的紋絲不亂的頭發(fā)上蜜宪,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音祥山,去河邊找鬼端壳。 笑死,一個胖子當(dāng)著我的面吹牛枪蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岖免,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼岳颇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颅湘?” 一聲冷哼從身側(cè)響起话侧,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎闯参,沒想到半個月后瞻鹏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡鹿寨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年新博,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚草。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡赫悄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馏慨,到底是詐尸還是另有隱情埂淮,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布写隶,位于F島的核電站倔撞,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏慕趴。R本人自食惡果不足惜痪蝇,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冕房。 院中可真熱鬧霹俺,春花似錦、人聲如沸毒费。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽觅玻。三九已至想际,卻和暖如春培漏,著一層夾襖步出監(jiān)牢的瞬間良漱,已是汗流浹背松却。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工照藻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涤躲,地道東北人疙驾。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓喜鼓,卻偏偏與公主長得像堂油,于是被迫代替她去往敵國和親惯退。 傳聞我的和親對象是個殘疾皇子披粟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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