2013-10-23 45 views
4

我只是試圖導入中文txt文件並打印出內容。 這裏是我的txt文件的內容是我從網絡,這是簡化的中國版本:http://stock.hexun.com/2013-06-01/154742801.html爲什麼我不能在python中使用編碼顯示中文字符?

起初,我嘗試了這一點:

userinput = raw_input('Enter the name of a file') 
f=open(userinput,'r') 
print f.read() 
f.close() 

它可以打開的文件和打印,但什麼是節目亂碼。 然後我嘗試了以下一個與編碼:

#coding=UTF-8 
userinput = raw_input('Enter the name of a file') 
import codecs 
f= codecs.open(userinput,"r","UTF-8") 
str1=f.read() 
print str1 
f.close() 

但是,它告訴我一個錯誤消息。 UnicodeEncodeError:'cp950編解碼器不能在位置50:非法多字節序列中編碼字符u'\ u76d8'。

爲什麼會發生該錯誤?如何解決它? 我試過其他的像Big5,cp950等unicode ...但它仍然不起作用。

+0

哪些內容?我複製了文章,它工作得很好。 – aIKid

+0

你能發佈你正在使用的確切文本文件嗎? – SheetJS

回答

0

Code page 936是唯一具有字符0x76D8(編碼爲0xC5CC)的字符。您需要使用GBK或CP936

-1

只是嘗試:

f=open(userinput,'r') 
print f.read().decode('gb18030').encode('u8') 
6

這是您所使用的顯示字符的終端系統。在Windows 7上使用IDLE,它工作正常:

>>> val = u'\u76d8' 
>>> print val 
盤 

,但如果我用cmd.exe然後我得到你的錯誤。

使用支持unicode編碼的終端顯示方法。

1

Python(至少在Python 3.0之前)知道兩種字符串:①一個字節數組和一個字符數組。

②中的字符是Unicode,這些字符串的類型也被稱爲unicode

①中的字節(Python中類型名爲str可以是可打印的字符串或其他(二進制數據)。如果它是可打印的字符串,則它也可以是Unicode字符串的編碼版本(例如UTF-8,latin-1或類似的)。然後幾個字節可以表示一個字符。

在你的用例,我建議讀文件字節的列表:

with open('filename.txt') as inputFile: 
    bytes = inputFile.read() 

然後從文件中使用的編碼解碼轉換是字節數組體面Unicode字符串(你必須找到了!):

unicodeText = bytes.decode('utf-8') 

然後打印:

print unicodeText 

最後步驟取決於輸出設備(xterm,...)的功能。它可能能夠顯示Unicode字符,然後一切都很好,字符得到正確顯示。但它可能無法使用Unicode,或者更有可能的是,Python只是不瞭解這些功能,那麼您將收到一條錯誤消息。如果您將輸出重定向到文件或將其導入第二個進程,也會發生這種情況。

爲了避免這樣的麻煩,你可以再次轉換Unicode字符串到字節數組,選擇您所選擇的編碼:

print unicodeText.encode('utf-8') 

這樣,你將只打印字節,每一個終端,輸出文件和第二個過程(當管道)可以處理。

如果輸入和輸出編碼是相同的,那麼當然你不需要解碼和編碼任何東西。但是由於您遇到了一些麻煩,因此很可能編碼不同,因此您必須執行這兩個步驟。

0
with open('chinese.txt','r+b') as inputFile: 
    bytes = inputFile.read() 
    print(bytes.decode('utf8')) 
相關問題