問題
程式如下:
輸出# -*- coding: utf-8 -*-
raw_input(u'輸入')
但是對print語句,卻沒有問題
原因可能是raw_input函式在接受引數u'輸入'時,採用的是ascii解碼方式,而首行注釋 coding: utf-8,只是宣告.py檔案在讀取的時候的解碼方式,對raw_input並不起作用。# -*- coding: utf-8 -*-
print u'輸入'
解決方法:
在python27目錄下的lib目錄中的site.py檔案
修改為
查了網上很多種方法,即使解決了異常,但是會引起輸出亂碼的問題。上面這種方法親測有效,如果哪位親按照我這種方法出現了問題,請告訴我(*^__^*)。
原因 解決完問題之後,讓我們來分析一下原因。因為自己是python的初學者,也只能是猜測一下,如果有不對的地方,請指出。
原因可能是raw_input函式在呼叫的時候,它自己可能直接或者間接的呼叫了上圖中的setencoding函式
而這個函式在第五行,設定了 encoding=ascii,這就導致了raw_input函式在對引數 u'輸入',按照ascii碼來處理,由於在ascii碼表中沒有匹配到字元,便丟擲異常。解決方式就是將encoding設定為中文編碼『gbk』,這樣對引數def setencoding():
"""set the string encoding used by the unicode implementation. the
default is 'ascii', but if you're willing to experiment, you can
change this."""
encoding = "ascii" # default value set by _pyunicode_init()
if 0:
enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]
if 0:
# enable to switch off string to unicode coercion and implicit
# unicode to string conversion.
encoding = "undefined"
if encoding != "ascii":
# on non-unicode builds this will raise an attributeerror...
sys.setdefaultencoding(encoding) # needs python unicode build !
u'輸入' 就能正確處理了。將『gbk』修改為『cp936』也是正確的。更多原因以及字元編碼,
關於字元編碼,請參考:
點這裡。 補充
你可能聽說過utf-8不需要bom,這種說法是不對的,只是絕大多數編輯器在沒有bom時都是以utf-8作為預設編碼讀取。即使是儲存時預設使用ansi(mbcs)的記事本,在讀取檔案時也是先使用utf-8測試編碼,如果可以成功解碼,則使用utf-8解碼。記事本這個彆扭的做法造成了乙個bug:如果你新建文字檔案並輸入"奼塧"然後使用ansi(mbcs)儲存,再開啟就會變成"漢a",你不妨試試 :)
讓我們用python來**一下為什麼:
新建文字檔案並輸入"奼塧"然後使用ansi(mbcs)儲存,再開啟就會變成""
我們在儲存記事本檔案時,採用的編碼方式為:ansi。仔細閱讀了超連結中的文章,就知道在window簡體中文系統中,ansi指的就是gbk編碼。用python程式檢視一下「」和漢a
的gbk編碼和utf-8編碼:
輸出如下# -*- coding: utf-8 -*-
u1 = u'漢a'
print repr(u1)
print repr(u1.encode('utf-8'))
u2 = u'奼塧'
print repr(u2)
print repr(u2.encode('gbk'))
可以看到
漢a的utf-8編碼和
奼塧 的gbk編碼是一樣的。
這麼一來,原因就顯而易見了,記事本在儲存
奼塧時,按照ansi也就是gbk編碼來儲存,在開啟檔案時,先按照utf-8進行測試編碼,如果可以解碼,則按照utf-8解碼。
再**一下u'字串'和'字串'的區別。
u表示後面跟的字串按照unicode編碼,而不加u表示字串按照類似c語言中char型別,乙個位元組乙個位元組的儲存編碼。用程式驗證,區別如下
輸出如下:# -*- coding: utf-8 -*-
u1 = '漢'
u2 = u'漢'
print repr(u1)
print repr(u2)print len(u1)
print len(u2)
從程式的輸出可以體會到,它們的卻別類似於c/c++中的char和wchar_t兩種資料型別的區別。
python 字串編碼問題
字串還有乙個編碼問題。因為計算機只能處理數字,如果要處理文字,就必須先把文字轉換為數字才能處理。最早的計算機在設計時採用8個位元 bit 作為乙個位元組 byte 所以,乙個位元組能表示的最大的整數就是255 二進位制11111111 十進位制255 0 255被用來表示大小寫英文本母 數字和一些符...
Python字串的編碼問題
字串在python內部的表示是 unicode 編碼,因此,在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼 decode 成unicode,再從unicode編碼 encode 成另一種編碼。decode的作用是將其他編碼的字串轉換成unicode編碼,如str1.d...
Python字串編碼
在python中有些特殊的地方是存在兩種字串,分別為str和unicode字串,他們都繼承自basestring。如 s hello world s為str us u hello world us為unicode。使用help str 和help unicode 可以檢視各自說明,他們都有decod...