linuxpython亂碼
1. 請教一個關於 Pythin 2.7 中文亂碼的問題
py2的編其實是最最貼近實際的編碼形式了。反倒是py3,如果遇到個編碼標記錯誤之類的問題,直接讓你自殺……
先說編碼是什麼:我們知道計算機里存儲任何數據都是存儲的二進制,但是一串文字若是當圖片那樣存儲太浪費空間不說,也會難以解析,所以ascii標准碼使用了7位二進制標記了128個字元和控制符號。當然7位不利於數據對齊,所以乾脆以8位存儲,最高位補個0就好,正好一個位元組,此即為基礎ascii編碼。
但是這128個字元里,雖然包含了常見英文符號和必須的控制符號(比如換行、回車、EOLN、EOF),卻對使用其它語言的用戶而言沒法用,畢竟各家字元不同哇……
首先是歐系拉丁語系指出,既然一個位元組一個字元,只用到7位,那麼還有128個編號可以用,於是規定了相應的拉丁語系主要符號,同樣單位元組表示,這樣就用到了多出來的一位,這套編碼稱之為latin-1
再往後,大多數其他拼音語言的國家表示,我們不用拉丁文符號,那麼把那128個額外字元改成別的符號,映射自己的文字就沒問題了。於是出現了多編碼頁,也就是最初的codepage。
但是中日韓為首的字形語言系的國家不行啊,你們丫的就幾十個符號,可中文之類光常用字就好幾千啊……於是針對中文出現了codepage936/gb2312,通過兩個位元組表示一個漢字,其中包含數千常用字,並且規定最高位為0的部分完全兼容ascii,但是若最高位為1,則必須是兩個位元組連續出現,用以表示一個漢字——隨後還出現了GBK,規定的字元更多,兼容gb2312,同樣是個雙位元組紀錄。
然而有兩件事情形成了阻礙:一是中文博大精深,漢字實在太多,算上生僻字,兩個位元組其實也不夠用;另一方面,在GB系編碼下,所有雙位元組字元都會被解釋成漢字,因此最多做到英漢混排,多語言沒戲,同時還會影響到諸如網路傳輸等等場景,因為同樣的雙位元組二進制數據,對應GBK中文與對應的日文韓文顯然不同,這就必須帶著編碼類型跑,稍不注意就不知道是個啥語言的玩意。
於是出現了unicode,是ANSI標准下的多國語言文字編碼。unicode使用32位二進製表示每一個字元,且任意語言任意符號都有獨立編碼,這樣就可以做到使用一套編碼同時處理多種不同語言。
unicode是個編碼方式,只涉及編號,並不管傳輸和存儲。針對需求,unicode產生了若干傳輸用編碼,其中比較普及的有utf32,utf16和utf8。utf32是每字元32位固定編碼,完整映射unicode原編碼而不做改變(當然,規定了一下傳輸時的端序問題);utf16則是最少16位最多32位,屬於變長unicode傳輸方案,以實現對部分codepage的兼容;而utf-8則是最小8位最大32位的編碼,變長,且英文部分完全兼容ascii。由於省空間及ascii兼容這兩點,使得改用utf8代價最小,才成為了主流。
python2里,與編碼有關的有三個部分:
一是源代碼識別問題。原本python解釋器純粹把源碼使用ascii編碼進行解析生成語法樹。考慮到源碼里可能存在其他語言的字元串量,提供了setdefaultencode介面,但是非常容易引發各類問題。PEP263指出在文件第一行或者第二行(僅限第一行為Unix腳本標注的情況下)寫入特殊格式的注釋# coding:xxx可以指定解釋器解釋源碼時使用的字元編碼。
第二部分則是內置類型轉換:python2里的str類,其實是個不存儲編碼信息的類型。也就是說它把內容二進制按照逐個位元組來處理和比對、運算。str類型的「字元串」如果拿來迭代一下,會直接拆成一個個位元組來處理。但是,一旦我們需要對非單位元組編碼的單個字進行處理的時候,python只提供了一個類型來解決問題,即unicode類(注意,實質上py里這個類是utf8進行內存存儲的,並不是utf32/unicode原編碼),所以常常需要相互轉換,將用到encode/decode兩個方法。原則上是,decode方法是將一個str按照指定編碼解析後轉換為unicode,encode方法則是把一個unicode對象用指定編碼表示並存儲到一個str對象里。
第三點是輸入輸出。Python2的print的實質是將str里的東西輸出到PIPE,如果你print的是一個unicode對象,它會自動根據LOCALE環境變數進行encode之後變成str再輸出。然而一般在Windows上都沒有設置locale環境變數,py2就按照默認的ascii編碼進行處理,於是對中文自然就編碼錯誤了。解決方法是手動encode成對應的輸出端可接受的編碼後輸出。win下一般都是gbk,linux下一般都是utf8
py3中的str則是unicode,bytes才類似於原str,默認代碼解析用utf8,默認輸出編碼也是utf8。
2. Redhat的LINUX下使用Python里pyodbc模塊插入sql Server數據中文亂碼
應該是資料庫和python腳本編碼方式不一樣,你把腳本編碼方式改成GBK或GB2312試試。
3. linux下python元祖中的中文print屏幕上顯示亂碼,怎麼解決
這個並不是亂碼,而是因為你輸出的是列表。他以編碼保存的而已。
你需要
foriinyoulist:
printi
這樣出來的結果就是中文了
4. SUSE Linux亂碼問題
解決方案無非就是把python的代碼的開頭編碼用utf-8,打開資料庫連接的時候也用charset='utf8',還搞什麼sys.setdefaultencoding('gbk'),mysql的my.cnf配置文件裡面配置為utf-8。等等之類的東西,無效,插入中文還是亂碼,就是插到資料庫裡面,直接看資料庫里的中文都是編碼,或者是????什麼的。
把問題簡單化,mysql的默認編碼為latin1,查找mysqldb的源碼關鍵報錯的地方是cursor.execute,這里要執行一下encode(charset),既然這里要encode,那就在外面先decode一下,果然什麼都不改,在自己的調用函數里做decode。
sql
=
'insert
into
aa
values('測試')'
sql
=
sql.decode('latin1')
cursor.execute(sql)
這樣就解決問題了,中文插入,中文顯示,在終端命令行直接查看資料庫也是中文。
試試,建表的時候不需要指定編碼。
5. python中文亂碼解決
windows下的文件路徑,cmd窗口等默認編碼都是gbk
但在windows下編寫python程序的時候,我們一般採用的編碼是utf-8
二者不一致是導致亂碼的根本原因!
在pycharm下,為了中文不亂碼,那麼需要注意一下幾個方面:
一、每一個源程序文件頭部,需要加上
#-*-coding:utf-8;-*-
這樣就沒有亂碼了
6. python中文亂碼是怎麼一回事
python報錯invalid character in identifier,意思就是「標識符中的無效字元」,檢查下有沒有字元是中文的,把中文字元改成英文字元再運行就可以了。
Python的作者有意的設計限制性很強的語法,使得不好的編程習慣(例如if語句的下一行不向右縮進)都不能通過編譯。其中很重要的一項就是Python的縮進規則。
一個和其他大多數語言(如C)的區別就是,一個模塊的界限,完全是由每行的首字元在這一行的位置來決定的(而C語言是用一對花括弧{}來明確的定出模塊的邊界的,與字元的位置毫無關系)。這一點曾經引起過爭議。
因為自從C這類的語言誕生後,語言的語法含義與字元的排列方式分離開來,曾經被認為是一種程序語言的進步。不過不可否認的是,通過強製程序員們縮進(包括if,for和函數定義等所有需要使用模塊的地方),Python確實使得程序更加清晰和美觀。
(6)linuxpython亂碼擴展閱讀
Python 中文編碼:
Python中默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確列印漢字,所以在讀取中文時會報錯。
解決方法為只要在文件開頭加入# -*- coding: UTF-8 -*-或者# coding=utf-8就行了
注意:# coding=utf-8的=號兩邊不要空格。
實例:
(Python 2.0+)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print( "你好,世界" )
輸出結果為:
你好,世界
7. python終端輸出亂碼怎麼解決
在命令行終端上工作時,經常會碰到一個頭疼的問題就是中文亂碼。下面我們就來看一下解決python在終端輸出亂碼的解決方法。
牽涉編碼的地方一共有五處:
Python代碼文件前兩行聲明的編碼
Python代碼文件實際存儲所使用的編碼
Vim的顯示編碼
Linux系統的文件編碼
SecureCRT等終端設置的顯示編碼
嚴格來講,五碼一致的時候,如果文件沒有損壞,應該是能夠正常顯示了。
Python編碼聲明:
如果python代碼文件中包含中文,就一定要在代碼文件的前兩行(注意:一定要是前兩行)做出編碼聲明,否則python代碼默認採用ASCII保存,這樣遇到中文字元就會報錯。在代碼頭部聲明編碼的方式有三種:
# coding=<encoding name>
# -*- coding: <encoding name> -*-
# vim: set fileencoding=<encoding name>
Vim中有關編碼的選項:
在 Vim 中,有四個與編碼有關的選項,它們是:fileencodings、fileencoding、encoding 和 termencoding。
Linux系統的編碼設置:
Linux的系統編碼設置可以通過設置locale來完成,直接在命令行敲locale,然後回車,即可查看當前系統的編碼設置,與保存文件相關的設置是LC_CTYPE。
如LC_CTYPE=zh_CN.gb18030,即把系統的編碼設置成為了gb18030。
更多Python知識請關注Python自學網
8. linux python運行報編碼錯誤
一次重啟伺服器後,supervisor接管的python腳本中的函數 open() 和 print() 都會報下面的編碼錯誤:
UnicodeEncodeError: 'ascii' codec can't encode
使用的是python3,按理說編碼都會默認utf-8,而且本地運行的python腳本並沒有這個問題。
經大佬指點,增加環境變數 export LC_ALL="en_US.UTF-8" 後,再重啟supervisor,問題解決
下面是復制的: https://www.cnblogs.com/badboy200800/p/11215981.html
Locale是一個軟體在運行時的語言環境,。是根據計算機用戶所使用的語言,所在國家或者地區,以及當地的文化傳統所定義的。它包括語言(Language), 地域 (Territory) 和字元集(Codeset)。
一個locale的書寫格式為: 語言[ 地域[.字元集]]。完全的locale表達方式是 [語言[ 地域][.字元集] [@修正值]。例如:
zh_CN.GB2312 => 中文_中華人民共和國+國標2312字元集。
(1)locale把按照所涉及到的文化傳統的各個方面分成12個大類
(2)查看標准字元集列表
常用字元集:en_US.utf8、zh_CN.gb2312、zh_CN.gbk、zh_CN.utf8等
3.Locale的設定
LC_ALL和LANG優先順序的關系:LC_ALL > LC_* >LANG
(1)如果需要一個純中文的系統的話,設定LC_ALL= zh_CN.XXXX即可。或者設定LANG=zh_CN.XXXX也可以,但是LC_ 不要有任何特殊設定才可以(因為LC_ 優先順序高)。
(2)如果需要個性化的環境,例如只想要一個可以輸入中文的環境,而保持菜單、標題,系統信息等等為英文界面,那麼只需要設定LANG=en_US.XXXX,然後 LC_CTYPE=zh_CN.XXXX就可以了。
(3)假如什麼也不做的話,也就是LC_ALL,LANG和LC_*均不指定特定值的話,系統將採用POSIX作為lcoale,也就是C locale。
4.查看與設定字元集實踐
(1)查看當前系統字元集三種方式(LC_ALL、LC_CTYPE和LANG),以查看LANG為例:
(2)更改系統字元集
備註:直接執行上述命令,可以臨時修改系統字元集。如果寫入環境變數可以永久改變字元集。
(3)取消當前系統字元集(設定為空)
備註:直接執行上述命令,可以臨時修改系統字元集。如果寫入環境變數可以永久改變字元集。
9. python 解壓後全是英文亂碼
用linux的話可以apt-get install untar-gzip ,好像是這個命令,我電腦沒帶, 等我下次再回你,我用這個軟體解壓,所有的都沒有亂碼