4

我只是想导入一个中文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 codec cant't encode character u'\u76d8' in position 50:illegal mutibyte sequence.

为什么会发生这个错误?如何解决?我尝试过其他 unicode,如 Big5、cp950 ......但它仍然无法正常工作。

4

5 回答 5

6

它是您用来显示字符的终端系统。在 Windows 7 上使用 IDLE 并且工作正常:

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

但如果我使用cmd.exe,我会得到你的错误。

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

于 2013-10-23T10:20:25.607 回答
1

Python(至少在 Python 3.0 之前)知道两种字符串:①字节数组和②字符数组。

②中的字符是Unicode,这种字符串的类型也称为unicode

①中的字节(strPython中命名的类型)可以是可打印的字符串或其他内容(二进制数据)。如果它是一个可打印的字符串,它也可以是一串 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')

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

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

于 2013-10-23T10:24:07.927 回答
0

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

于 2013-10-23T10:15:46.120 回答
0
with open('chinese.txt','r+b') as inputFile:
    bytes = inputFile.read()
    print(bytes.decode('utf8'))
于 2018-02-12T15:11:38.150 回答
-1

试试看嘛:

f=open(userinput,'r')
print f.read().decode('gb18030').encode('u8')
于 2013-10-23T10:16:53.700 回答