为什么在Python中打印UTF-8文件的文本时看不到希伯来字符?

3 投票
4 回答
7427 浏览
提问于 2025-04-16 21:59

我正在尝试从一个文本文件中读取希伯来语:

def task1():
    f = open('C:\\Users\\royi\\Desktop\\final project\\corpus-haaretz.txt', 'r',"utf-8")
    print 'success'
    return f

a = task1()

但是当我读取的时候,它显示的是这个:

'[\xee\xe0\xee\xf8 \xee\xf2\xf8\xeb\xfa \xf9\xec \xe4\xf0\xe9\xe5-\xe9\xe5\xf8\xf7 \xe8\xe9\xe9\xee\xf1: \xf2\xec \xe1\xe9\xfa \xe4\xee\xf9\xf4\xe8 \xec\xe1\xe8\xec \xe0\xfa \xe7\xe5\xf7 \xe4\xe7\xf8\xed, \xec\xe8\xe5\xe1\xfa \xe9\xf9\xf8\xe0\xec \xee\xe0\xfa \xf0\xe9\xe5 

还有很多其他的内容。

我该怎么读取它呢?

4 个回答

1

看起来你得到的字符串编码是 'windows-1255',而不是 'utf-8'。试着用那个编码来打开文件看看。

1

你需要使用 codecs 这个模块来打开文件。普通的 open() 方法(可以查看 文档)并没有像那样接受第三个参数,第三个参数应该是 bufsize

具体来说,要用 codecs.open()。读取的时候要解码,输出的时候要编码 :-)

5

你可以这样打印:

print task1().encode('your terminal encoding here')

你需要确保你的终端能够显示希伯来字符。比如,在一个完整的支持utf-8的Linux系统上,并且安装了希伯来语言包:

print task1().encode('utf-8')

注意使用 open 的时候:

  • 在python 2.7中,你没有编码参数。你需要使用 codecs 模块。
  • 在python 3及以上版本中,编码参数是第四个,而不是你想的第三个。你可以这样写 open(path, 'r', encoding='utf-8')。其实你甚至可以省略 'r'

那么为什么要使用 encode 呢?

其实,当你读取一个文件并告诉Python使用什么编码时,它返回的是一个unicode对象,而不是字符串对象。例如在我的系统上:

>>> import codecs
>>> content = codecs.open('/etc/fstab', encoding='utf-8').read()
>>> type(content)
<type 'unicode'>
>>> type('')
<type 'str'>
>>> type(u'')
<type 'unicode'>

如果你想把包含非ASCII字符的内容变成可打印的字符串,你需要把它重新编码成字符串:

>>> type(content.encode('utf-8'))
<type 'str'>

我们使用 encode 是因为这里我们在处理一个比较通用的文本对象(unicode是处理文本时最通用的方式),然后你把它(编码)转换成一个特定的表示方式(utf-8)。

我们需要这种特定的表示方式,因为你的系统对Python内部的工作原理并不了解,如果不指定编码,它只能打印ASCII字符。所以当你输出时,你需要特别指定一个系统能理解的编码。对我来说,幸运的是是'utf-8',所以很简单。如果你在Windows上,可能会有点麻烦。

撰写回答