2013-10-23 46 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')) 
相关问题