python命令行亂碼
① 用shell編寫python腳本,腳本中的中文都是亂碼(中文注釋也是亂碼)
第一,查看系統字元集,命令行下輸入:locale查看是否utf8,如不是,可以輸入:export LANG=en_US.UTF-8
export LANG_ALL = en_US.UTF-8
第二,python文件頭部聲明:# coding: utf-8
② python命令行輸入中文亂碼怎麼辦
python2.X,代碼中指抄定了UTF-8,但是在cmd命令行窗口襲時,列印的中文仍然會亂碼。
在python3不存在該問題
運行結果:
原因
中文windows默認的輸出編碼為gbk ,與腳本中定義的UTF-8不一樣,所以出現了解碼失敗的情況。
相關推薦:《Python基礎教程》
解決方法
有如下兩種方法可以解決這個問題
方法一
我們可以通過先把中文解碼為unicode,然後再轉化為gbk來解決這個問題:
修改後運行結果:
方法二
當然,我們也可以通過改變cmd命令行窗口的輸出格式來解決這個問題:
·chcp 65001 就是換成UTF-8代碼頁
·chcp 936 可以換回默認的GBK
但是這樣就降低了腳本的兼容性,在其他環境運行的時候可能還會出現這樣的錯誤,而且可能會影響其他腳本運行,所以推薦使用第一種方法。
③ python command亂碼怎麼解決
python command亂碼怎麼解決?具體方法如下:
相關推薦:《Python教程》
先引入import sys
再加一句:type=sys.getfilesystemencoding()
然後在輸出亂碼的數據的後面加上「.decode('utf-8').encode(type)」。
比如輸入「ss」亂碼。
就寫成print ss.decode('utf-8').encode(type)即可。
④ 為什麼Python腳本中的中文在CMD中輸入為亂碼
你可以查看一下你的腳本的編碼格式是否和你cmd環境的編碼格式一致. windows環境下使用gb2312
python腳本中如果使用utf-8的話,則增加
# -*- coding: utf-8 -*-
在腳本中可以修改你的編碼格式, 方法如下:
sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding('UTF-8')
sys.getdefaultencoding()
這里的'utf-8'就是你設置的默認格式. 你可以進行修改為與系統一致的格式.例如:GB2312
⑤ python顯示亂碼
多次被python的編碼/亂碼問題困擾,相信pythoner們都被困擾過,網上鋪天蓋地的資料太多也參差不齊,就整理了下。本文從使用的角度系統總結了python編碼相關的一些概念,將本文的例子玩一遍,基本上對python的編碼問題就清楚了。
首先明確幾個概念:
位元組流:以utf8/gbk等編碼編碼的位元組流。
unicode對象:python代碼中,a=u'中國', 或者a='中國'.decode()的結果。
terminal用於顯示字元的編碼:將一個用utf8/gbk編碼的位元組流通過terminal指定的編碼,去查找對應的字元顯示出來。
locale:linux下,Locale 是軟體在運行時的語言環境, 它包括語言(Language), 地域 (Territory) 和字元集(Codeset)。一個locale的書寫格式為: 語言[_地域[.字元集]]. 所以說呢,locale總是和一定的字元集相聯系的。比如:zh_CN.GB2312
編碼轉換原則:unicode是」中介」,任何編碼之間轉換都需要先decode()到unicode。
針對python,先把結論放在前面,三點:
#coding:utf-8 #.py文件是什麼編碼就需要告訴python用什麼編碼去讀取這個.py文件。
sys.stdout.encoding,默認就是locale的編碼,print會用sys.stdout.encoding去encode()成位元組流,交給terminal顯示。所以locale需要與terminal一致,才能正確print列印出中文。
sys.setdefaultencoding(『utf8』),用於指定str.encode() str.decode()的默認編碼,默認是ascii。
對編碼字元串a,代碼中可以直接寫a.encode(「gbk」),但事實上內部自動先通過defaultencoding 去decode成unicode之後再encode()的。
str(xxx)應該也是用這個去編碼的。
'ascii' codec can't encode characters in position 7-8: ordinal not in range(128)print的時候出現這個錯誤一般可以使用這個方案去處理。
為了避免代碼中到處都要去encode(「xxx」),還有可能不同的地方寫得不一樣帶來不一致的情況,推薦使用這個:
import sys
reload(sys)
sys.setdefaultencoding('utf8')
例子1:
在python中,unicode vs 位元組流:位元組流可以從unicode encode得到,unicode可以從utf8/gbk等編碼的位元組流decode得到。
分析下面這段代碼,終端/locale分別為不同編碼的情況:
#coding:utf-8 #由於.py文件是utf-8的,所以必須有這一句
import sys
import locale
import os
import codecs
reload(sys)
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
sys.setdefaultencoding('utf8') #影響encode()
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
print sys.stdout.encoding + " - sys.stdout.encoding:"
#sys.stdout = codecs.getwriter('utf8')(sys.stdout) #影響print
print sys.stdout.encoding + " - sys.stdout.encoding:"
u = u'中國'
print u + " - u"
a = '中國'
print a + " - a"
print a.decode('utf-8') + " - a.decode('utf-8')"
print a.decode('utf-8').encode('gbk') + " - a.decode('utf-8').encode('gbk')"
print a.decode('utf-8').encode('utf-8') + " - a.decode('utf-8').encode('utf-8')"
print a.decode('utf-8').encode() + " - a.decode('utf-8').encode()"
print (sys.stdout.encoding) + " - (sys.stdout.encoding)"
print (sys.stdout.isatty())
print (locale.getpreferredencoding())
print (sys.getfilesystemencoding())
—終端為UTF-8,locale為zh_CN.GBK—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
GBK - sys.stdout.encoding:
GBK - sys.stdout.encoding:
?й? - u
中國 - a
?й? - a.decode('utf-8')
?й? - a.decode('utf-8').encode('gbk')
中國 - a.decode('utf-8').encode('utf-8')
中國 - a.decode('utf-8').encode()
GBK - (sys.stdout.encoding)
True
GBK
utf-8
—終端為UTF-8,locale為zh_CN.UTF-8—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
UTF-8 - sys.stdout.encoding:
UTF-8 - sys.stdout.encoding:
中國 - u
中國 - a
中國 - a.decode('utf-8')
?й? - a.decode('utf-8').encode('gbk')
中國 - a.decode('utf-8').encode('utf-8')
中國 - a.decode('utf-8').encode()
UTF-8 - (sys.stdout.encoding)
True
UTF-8
utf-8
—終端為GBK,locale為zh_CN.GBK—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
GBK - sys.stdout.encoding:
GBK - sys.stdout.encoding:
中國 - u
涓???? - a
中國 - a.decode('utf-8')
中國 - a.decode('utf-8').encode('gbk')
涓???? - a.decode('utf-8').encode('utf-8')
涓???? - a.decode('utf-8').encode()
GBK - (sys.stdout.encoding)
True
GBK
utf-8
—終端為GBK,locale為zh_CN.UTF-8—————–
ascii - sys.getdefaultencoding()
utf8 - sys.getdefaultencoding()
UTF-8 - sys.stdout.encoding:
UTF-8 - sys.stdout.encoding:
涓???? - u
涓???? - a
涓???? - a.decode('utf-8')
中國 - a.decode('utf-8').encode('gbk')
涓???? - a.decode('utf-8').encode('utf-8')
涓???? - a.decode('utf-8').encode()
UTF-8 - (sys.stdout.encoding)
True
UTF-8
utf-8
例子1總結,對print而言:
unicode的數據如果要顯示正常,必須終端與locale一致。sys.stdout.encoding這個值應該來自locale,print會以sys.stdout.encoding去encode並輸出到位元組流。
encode為終端編碼的位元組流就能顯示正常,無論locale是啥。
最終是terminal通過terminal配置的編碼規則去解碼成對應的字元並顯示出來。
例子2:
關於sys.setdefaultencoding(『utf8』)的例子:
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
print sys.getdefaultencoding() + " - sys.getdefaultencoding()"
a = '中國'
print a + " - a"
print a.encode("gbk") #並不是直接從utf8的位元組流轉化到gbk的,而是通過defaultencoding decode之後才轉的。
print a.decode() #使用默認的defaultencoding
print a.encode() #使用默認的defaultencoding
關於str()和repr()
str()是對各種類型轉化成str,如果本來是encoded字元串,則不變,如果為unicode,會encode()
repr()對字元串是將位元組流出二進制的值以16進制轉化為可見字元。
測試環境locale為GBK
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
a = u'中國'
print a
print str(a)
print repr(a)
print repr(a.encode("utf-8"))
print repr(a.encode("gbk"))
中國
涓????
u'\u4e2d\u56fd'
'\xe4\xb8\xad\xe5\x9b\xbd'
'\xd6\xd0\xb9\xfa'
再深挖下去,還有repr()和eval()的關系,就不深挖了。
關於終端和伺服器的編碼
另外補充一些關於終端和伺服器編碼的結論:
1. 對mac iterm2,如果server的locale與mac本地終端的locale一致,才能保證server端與本地的表現一致。
2. cat a.py #就把文件顯示出來,就是給terminal一串位元組流。terminal根據設置的終端編碼規則來顯示字元。所以只要文件編碼與terminal一致即可,與locale無關。
3. cat a.txt > b.txt #無論locale怎麼樣,只跟a.txt原來的編碼相關
4. echo 「中國年過」 > a.txt #這個情況下,只有terminal與locale的編碼一致,你才能在終端shell打出正確的中文~~~所以a.txt與兩者都會一致
⑥ python IDLE 控制台輸出亂碼問題怎樣解決
在源代碼開始處加上如下這句:
# -*- coding: GBK -*-
...... 其他 Python 源代碼 ......
然後,選擇 IDLE 的菜單 Options ->
Configure IDLE... 打開 IDLE 的配置選項,切換到 General 選項卡,找到 Default Source
Encoding 設置項,選中 Locale-defined 選項,點擊 Apply 按鈕,再點擊 OK 以便保存設置。
關閉退出 IDLE 並重寫打開 IDLE 集成開發環境,此時你再試一下:
⑦ python 中文亂碼問題
亂碼原因:
因為你的文件聲明為utf-8,並且也應該是用utf-8的編碼保回存的源文件。但是windows的本答地默認編碼是cp936,也就是gbk編碼,所以在控制台直接列印utf-8的字元串當然是亂碼了。
解決方法:
在控制台列印的地方用一個轉碼就ok了,列印的時候這么寫:
print myname.decode('UTF-8').encode('GBK')
比較通用的方法應該是:
import sys
type = sys.getfilesystemencoding()
print myname.decode('UTF-8').encode(type)
⑧ python window 命令行返回結果亂碼怎麼解決
解決方法如下:
print u"你好".encode("GBK")
默認的終端編碼是和系統編碼一致的,這時就需要encode為對應的編碼來顯示。
⑨ python中文顯示亂碼,已經在開頭有了coding: utf-8
亂碼原因:
因為你的文件聲明為 utf-8,並且也應該是用 utf-8 的編碼保存的源文件。但是 windows 的本地回默認編碼是 cp936,也就答是 gbk 編碼,所以在控制台直接列印 utf-8 的字元串當然是亂碼了。
解決方法:
py文件用記事本打開,另存為utf-8格式即可
⑩ python3 中文輸出亂碼問題
python 3和2很大區別就是python本身改為默認用unicode編碼。
字元串不再區分"abc"和u"abc", 字元串"abc"默認就是unicode,不再代表本地編內碼、
由於有這種內容部編碼,像c#和java類似,再沒有必要在語言環境內做類似設置編碼,比如「sys.setdefaultencoding」;
也因此也python 3的代碼和包管理上打破了和2.x的兼容。2.x的擴展包要適應這種情況改寫。
另一個問題是語言環境內只有unicode怎麼輸出gbk之類的本地編碼。
答按慣例都在(序列化)輸出時才轉換成本地編碼。
比如
file.write("GBK的中文".encode("GBK"))
python環境內字元串用str.encode("GBK")方法輸出成位元組串用於和其他環境交流。