1. 程式人生 > >Python2中print字串含有漢字無法在終端和cmd正確顯示怎麼辦?亂碼和編碼錦集

Python2中print字串含有漢字無法在終端和cmd正確顯示怎麼辦?亂碼和編碼錦集

Python2正確輸出含有漢字的字串

前言:

這個也是做CSDN爬蟲專案中遇到的一個神奇的bug。雖然現在發現,並不是bug,而很可能是我自己的操作失誤。
但是這個失誤讓我從昨天晚上,到現在都在煩躁當中~
一直很好奇,為啥這種最基礎的print輸出問題,網上就找不到一個契合的解決方案呢?
現在才知道,我出錯的方式有點詭異。
不多bb了,直接上程式碼吧——

demo1

Ubuntu16,Python2,且安裝過中文語言什麼的。

#!usr/bin/python
# -*- coding: utf-8 -*-
a = "我就是中文啊"
print("a:",a)

輸出就是:

('a:', '\xe6\x88\x91\xe5\xb0\xb1\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe5\x95\x8a')

各種嘗試,encode和decode,都不行!咦,為啥呢?
後來才知道,Python2和Python3的輸出真的不是一樣的哎!

Python2中的print加了括號之後,前面有字串,再加逗號,再加帶有中文的字串變數就是會亂碼!

這種組合就是不行,所以只能打破這種組合,比如說下面這種:

#!usr/bin/python
# -*- coding: utf-8 -*-
a = "我就是中文啊"
print a

輸出:
這裡寫圖片描述

可以看出來,沒有問題

可見並不是Ubuntu的終端不能正確顯示中文的問題,而是我的操作不對,但是上面的操作很明顯不能滿足我的所有要求,我的字串變數應該要和字串的說明一起出現,才比較方便觀看。
我們來看看接下來的操作:

#!usr/bin/python
# -*- coding: utf-8 -*-
a = "我就是中文啊"
print "a:%s"%a
#這裡的操作應該是Python2的正常print了,可惜我一直都用了();
#自以為這樣,不管是Python2還是python3都可以處理print函式
#至於%s的意思大家應該清楚,簡單解釋一下,%類似於取地址,s是string,字串的意思。和c裡面的輸出原理類似。

這裡的輸出如下:

a:我就是中文啊

美滋滋,Ubuntu下是可以解決這樣的問題了。

Windows下的情況還是不一樣的!

Windows下cmd中python2正確print輸出帶有漢字的字串變數

題目起的有點長:
剛開始我在Windows下操作的時候,不管怎麼都無法顯示中文,就連上面最後一個demo都無法顯示。
百度到的答案是,Windows中cmd的自帶編碼格式不支援utf-8,得在cmd中輸入 cp65001,然後我就可以輸入下面的程式碼,得到再下面的輸出了:

#!usr/bin/python
# -*- coding: utf-8 -*-
a = "我就是中文啊"
print "a:%s"%a

這時候的輸出才是正常的:

a:我就是中文啊

也可以試試下面的操作:
先把cmd設定成cp936,對就是在cmd中輸出cp936,然後cmd會支援gbk格式。

a = "我就是中文啊"
print a.decode('utf-8').encode('GBK')

這裡的輸出就很明顯了,會直接顯示中文

我就是中文啊

現在發現了最終的奧妙,也就是——如果字串中有漢字,那麼,python2不能加括號!

OK,其實我覺得如果和我一樣遇到了這個問題,是很難搜到我這篇部落格的,尷尬~
我當時就遇到了同樣的問題,很難用關鍵詞去描述,所以關注我吧,關注我不迷路哦,接下來會不斷地更新我的學習筆記~

新問題更新:

這個問題還是沒有解決,上面說到,如果python2 print的內容既有中文又有英文,那麼編碼格式應該就會亂,而導致中文亂碼,我只好用格式化輸出,才能同時顯示字串和有中文字串的變數。
但是如果列表demo_list = [“我是中文啊”,”我也是ai”]
直接print demo_list,就會亂碼
只能

for i in demo_list:
    print i

很是尷尬,不知所措~