Python中如何读取用UTF-8编码的阿拉伯文本

5

我是一名使用Python 2.7的IT技术人员。我从一个以UTF-8编码的文本文件中获取了下面这行字符串:

"تازہ ترین خبروں، بریکنگ نیوز، ویڈیو، آڈیو، فیچر اور تجزیوں کے لیے بی بی سی اردو"

我正在使用以下代码将其打印在屏幕上:

import codecs
filename = codecs.open('file path', 'r', encoding="utf-8")
outputfile = filename.readlines()
print outputfile

它会输出以下结果:
[u'\ufeff\u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u062e\u0628\u0631\u0648\u06ba\u060c \u0628\u0631\u06cc\u06a9\u0646\u06af \u0646\u06cc\u0648\u0632\u060c \u0648\u06cc\u0688\u06cc\u0648\u060c \u0622\u0688\u06cc\u0648\u060c \u0641\u06cc\u0686\u0631 \u0627\u0648\u0631 \u062a\u062c\u0632\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc \u0628\u06cc \u0633\u06cc \u0627\u0631\u062f\u0648 \u06a9\u06cc \u0648\u06cc\u0628']

目的是正确打印文本,而不是如何打印每一行。那么,我该如何以其原始形式正确地打印字符串或文本文件的内容呢?就像这样:
تازہ ترین خبروں، بریکنگ نیوز، ویڈیو، آڈیو، فیچر اور تجزیوں کے لیے بی بی سی اردو     
2个回答

4

你看到的只是字符串的表现形式。由于你正在打印列表,因此显示的是表现形式,而不是可读形式。

你可以正常地打印它,每行一个:

for line in outputfile:
    print(line)

演示:
>>> s = u'\ufeff\u062a\u0627\u0632\u06c1 \u062a\u0631\u06cc\u0646 \u062e\u0628\u0631\u0648\u06ba\u060c \u0628\u0631\u06cc\u06a9\u0646\u06af \u0646\u06cc\u0648\u0632\u060c \u0648\u06cc\u0688\u06cc\u0648\u060c \u0622\u0688\u06cc\u0648\u060c \u0641\u06cc\u0686\u0631 \u0627\u0648\u0631 \u062a\u062c\u0632\u06cc\u0648\u06ba \u06a9\u06d2 \u0644\u06cc\u06d2 \u0628\u06cc \u0628\u06cc \u0633\u06cc \u0627\u0631\u062f\u0648 \u06a9\u06cc \u0648\u06cc\u0628'

>>> print(s)
تازہ ترین خبروں، بریکنگ نیوز، ویڈیو، آڈیو، فیچر اور تجزیوں کے لیے بی بی سی اردو کی ویب

我的系统(win7)上无法运行i,我在想你是怎么得到这个演示的? - Coddy
哦?你的发生了什么事? - aIKid
2
你的终端程序很可能是...尝试在IDLE中运行它(cmd.exe中的字体不支持阿拉伯字符)。 - Joran Beasley
2
@Coddy:这可能会回答你的问题:https://dev59.com/PG025IYBdhLWcg3w960W#5708560。问题不在于字体本身:如果是这样,那么你将看到替换字符而不是编码错误。如果那个答案是正确的,Spyder使用CP-1252,那么阿拉伯字符根本无法在该字符编码中表示,因此Spyder永远不会接受它们。最好的情况是,Spyder在某个地方有一些选项可以更改终端使用的编码方式。将其更改为具有所需字符的编码方式(如果可能,则尝试使用UTF-8,否则尝试使用ISO 8859-6)。然后在打印之前将字符串编码为该编码方式。 - Steve Jessop
2
@Coddy 就像其他人所说,问题出在你的终端上。但对于编码文本,通常你不需要真正将文本打印到终端上。如果你真的需要看到输出,就将其打印到文件或其他地方。 - aIKid
显示剩余6条评论

1

readlines() 返回一个 list。当你打印一个 list 时,它会打印列表中每个项目的 repr()。字符串的 repr 编码方式如此,以确保它不依赖于系统编码。你想直接打印字符串:

print outputfile[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接