python以什么表示代码层次_python 中几个层次的中文编码.md
介紹
一直不太喜歡使用命令行,所以去年年底的技術創新中,使用TkInter來開發小工具。結果花費了大量的時間來學習TkInter ui的使用。
最近想整理該工具,使用命令行的形式,然后將該工具做成exe的形式進行分發。在工作一開始就遇到了編碼的問題。
在腳本中有如下代碼,用來接收用戶交互式輸入的ip。
server = raw_input("請輸GIS Server IP:")
在腳本文件的第一行,我已經加了如下代碼
# -*-coding: utf-8 -*-
但是在windows 的控制臺執行的時候,出現了亂碼。有點不解,因為自己一直以來在python中,處理中文都是在文件頭加入該代碼。
通過搜索發現,是因為在windows cmd 默認的使用的cp936的編碼。既然知道使用這種編碼則將編碼改為如下:
# -*-coding: cp936-*-
但是得到如下的錯誤:
SyntaxError: encoding problem: cp936 with BOM
百思不得其解。作為懶癌患者,就想繞過去。則采用如下方式,對單獨字符串進行編碼。
userName=raw_input("請輸入站點管理員用戶名:".decode("utf-8").encode("cp936"))
這樣重要在cmd中可以正常的輸出中文了。但是問題來了,我的腳本中,有上百行代碼有中文。每個地方都這么寫,感覺偷懶不成,反被*。
這個時候,通過搜索。逐步的發現了問題的原因。這是因為python有幾個層次的編碼。分別是:
字符串變量級別編碼
腳本級別的編碼
py文件級別的編碼
顯示窗口的編碼
字符串變量的編碼
對單個字符串轉碼,可以使用:encode()編碼成可以顯示的。通常對字符串不能由一個編碼直接轉換為另一個編碼。通常需要解碼到Unicode,然后對unicode字符串重新的編碼。比如上面的示例。
腳本的編碼
上面通過設置 #coding:utf-8設置的就是腳本里面內容的編碼。也就是該腳本文件中所有的字符串變量都采用該處設置的編碼方式。
py文件的編碼
py文件的編碼,默認的是ANSI。但是也可以使用utf-8,unicode編碼。
顯示窗口的編碼
上面的幾種情況,中文在運行階段不會出錯。但是這些中文還不一定能夠正常的顯示。能否正常的顯示,還有顯示窗口支持的編碼決定。比如cmd中中文支持GBK和cp936,所以代碼中的字符串需要編碼到這兩種才可以顯示。
測試
當py文件的編碼為utf-8的時候。代碼中唔需要添加#coding:utf-8 。腳本中的中文,在運行過程不會報錯。
當py文件的編碼為ANSI的時候。如代碼中沒有顯示的添加 ** --coding:utf-8 -- **,則當代碼中出現中文的時候,運行腳本的時候。會出現如下錯誤
SyntaxError: Non-ASCII character '\xe4' in file
當py文件設置為utf-8,而顯示設置代碼編碼為#coding:936。則會出現ncoding problem: cp936 with BOM的錯。這個時候,將py文件的編碼改為ANSI即可。
結論
通過上面的測試,有幾個結論:
編碼有層次結構。文件編碼影響腳本內容編碼,腳本內容編碼決定 其中的字符串編碼。
當字符串顯示設置了編碼的時候。字符串的編碼為顯示設置的編碼,此時文件和腳本編碼不起作用。當字符串沒有顯示設置編碼的時候,則采用上一級編碼決定。
所以設置這三種編碼的時候,需要確保三種編碼之間能夠轉換。否則會出現上面列舉的錯誤。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的python以什么表示代码层次_python 中几个层次的中文编码.md的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些琐碎+分不清的知识点
- 下一篇: Caffe 训练时loss等于87.33