为什么即使使用编码我也无法在python中显示中文字符?

时间:2013-10-23 10:12:13

标签: python unicode encoding

我只是想导入一个中文txt文件并打印出内容。 以下是我从网上复制的txt文件的内容,简体中文:http://stock.hexun.com/2013-06-01/154742801.html

起初,我试过这个:

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':非法的mutibyte序列。

为什么会发生错误?怎么解决? 我尝试过像Big5,cp950这样的其他unicode ......但它仍然不起作用。

5 个答案:

答案 0 :(得分:6)

这是用于显示角色的终端系统。在Windows 7上使用IDLE,它工作正常:

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

但如果我使用cmd.exe,那么我会收到您的错误。

使用支持unicode编码的终端显示方法。

答案 1 :(得分: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')

这样你只会打印每个终端,输出文件和第二个进程(管道时)可以处理的字节。

如果输入和输出编码相同,那么当然,您不必解码和编码任何东西。但是,由于您遇到了一些麻烦,因此编码很可能会有所不同,因此您必须执行这两个步骤。

答案 2 :(得分:0)

Code page 936是唯一具有字符0x76D8(编码为0xC5CC)的字符。你需要使用gbk或cp936

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

JUst TRY:

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