2013-10-09 53 views
3

我已經閱讀了關於unicode的一些線程。Python 2.7 Unicode函數中的錯誤(使用__future__ print_function和unicode_literals)

我使用Python 2.7.2,但隨着未來print_function(因爲原始打印語句是我相當混亂..)

因此,這裏是一些代碼:

# -*- coding: L9 -*- 
from __future__ import print_function, unicode_literals 

現在如果我打印東西像

print("öäüߧ€") 

它完美的作品。 但是,是的,我是完全新的Python,如果我聲明一個函數,將打印吹拂我的腳本

def foo(): 
    print("öäü߀") 

foo() 

Traceback (most recent call last): 
    File "C:\Python27\test1.py", line 7, in <module> 
    foo() 
    File "C:\Python27\test1.py", line 5, in foo 
    print("÷õ³▀Ç") 
    File "C:\Python27\lib\encodings\cp850.py", line 12, in encode 
    return codecs.charmap_encode(input,errors,encoding_map) 
UnicodeEncodeError: 'charmap' codec can't encode character u'\x80' in position 4: character maps to <undefined> 

什麼是處理此錯誤和Unicode,一般最好的辦法unicode字符串? 我應該堅持使用2.7打印語句嗎?

+0

您的代碼確實對我有用。就個人而言,我會避免使用print語句 – alexvassel

+0

感謝alexvassel,你在linux上運行它嗎?我試圖在XP上 - 應該寫在問題中.. – AdventureTime

+0

我使用Linux和Python 2。7 – alexvassel

回答

1

我懷疑print("öäü߀".encode('L9'))會解決你的問題。

+0

感謝您的快速響應和提示。 好吧,它停止了我的腳本吹,但有字母錯誤。現在輸出看起來像這樣: õ▀▀ 編輯:現在如果我將控制檯代碼頁更改爲1252(西歐),字母再次罰款。然而,標準850chcp中必須有一個解決方案,因爲第一個打印語句與特殊字符一起工作 – AdventureTime

+0

@AdventureTime爲了使它看起來正確地在控制檯中正常工作,指定給'encode'的編碼必須* both * (a)能夠處理字符串中的所有Unicode字符; *和*(b)與您的控制檯的編碼設置兼容。如果您不想調整終端編碼,請在代碼中調整編碼。不過,一般來說,我建議您將編輯器和控制檯中的所有編碼設置爲utf-8。 – Marcin

+0

感謝您的回覆。 現在我所做的是將編碼cookie更改爲# - * - coding:utf-8 - * - 並使用print(「öäü߀」.encode(「utf-8」)),但控制檯現在用這個錯誤「SyntaxError:(unicode error)'utf8'編解碼器無法解碼位置0中的字節0xf6:無效起始字節」 – AdventureTime

0

控制檯代碼頁使用傳統的「OEM」代碼頁與舊的DOS控制檯程序兼容,而Windows的其餘部分使用支持現代字符的更新代碼頁,但仍因地區而異。在你的情況下,控制檯使用cp850和GUI程序使用cp1252cp850不支持歐元字符,所以Python在試圖在控制檯上打印字符時引發異常。如果您需要歐元工作,您可以在運行腳本之前運行chcp 1252。但請確保控制檯字體支持該字符。

BTW,L9!= cp1252要麼。

您確定從控制檯打印使用歐元嗎?當我剪切並粘貼print時,如果代碼頁是850,我會得到以下代碼,但它在chcp 1252之後可用。

>>> print("öäüߧ€") 
öäüߧ?     # Note the ? 

編碼圖表:

+0

感謝您的評論;關於cp:最後一個鏈接表示「ISO/IEC 8859-15也可以在Windows-1252中找到。」然而,如何在我的控制檯中工作?:C:\ Python27 \ test1> chcp Aktive Codepage:850. C:\ Python27 \ test1> echo$€€ – AdventureTime

+0

'echo'也適用於我,但是Python'print'沒有。 「echo」不是Python,我懷疑微軟正在幕後玩遊戲,因此歐洲玩家對控制檯感到滿意。控制檯可以顯示不在其代碼表中的字符。我可以鍵入一個歐元,但Python不會打印一個。請參閱圖表鏈接。並非所有的8859-15都在Windows 1252中。 –

+0

好吧謝謝,整個話題在我看來都不一致。例如我運行腳本,它會打印一些字母。我重新啓動我的機器,並再次運行相同的設置它顯示我完全不同的字母..不知何故令人沮喪 – AdventureTime

0

這可能會幫助:

print(type(s1)) 
s1.encode('ascii',errors='ignore') #this works 
s1.decode('ascii',errors='ignore') #this does not work 

的原因是,s1.decode不能解碼的unicode直接這麼編碼的顯式調用時首次提出,但沒有錯誤=「忽略」標誌從而引發錯誤

根據您是否正在發放你的命令從一個文件或者來自一個支持unicode的python提示可能會解釋爲什麼你會在後者中得到一個錯誤,而不是前者。

相關問題