如何在PYTHON中正确打印阿拉伯文本

18

我正在使用Python 2.7尝试打印像这样的阿拉伯字符串

print "ذهب الطالب الى المدرسة"

它会输出以下结果:

ط°ظ‡ط¨ ط§ظ„ط·ط§ظ„ط¨ ط§ظ„ظ‰ ط§ظ„ظ…ط¯ط±ط³ط©

目的是正确地打印文本,而不是如何打印每一行。那么,我如何以其原始形式正确地打印字符串或文本文件的内容?例如:

ذهب الطالب الى المدرسة

3
建议转向使用Python 3.5。 - ForceBru
1
@ForceBru "Python3.6是值得称作Python3的一个版本" --Raymond Hettinger。所以建议转换到Python3.6。 - Mohammad Yusuf
1
问题可能不在于Python,而是您正在使用的终端仿真器。如果您在终端中键入 echo ذهب 并按 Enter,它是否会按预期打印阿拉伯语单词? - Flimm
8个回答

20
通过这个模块,您可以纠正文本的形状和方向。 只需安装pips并使用它。
# install: pip install --upgrade arabic-reshaper
import arabic_reshaper

# install: pip install python-bidi
from bidi.algorithm import get_display

text = "ذهب الطالب الى المدرسة"
reshaped_text = arabic_reshaper.reshape(text)    # correct its shape
bidi_text = get_display(reshaped_text)           # correct its direction

这个问题可以使用双向文本处理方法来解决,只需一行代码即可。然后,它会继续反转段落中的RTL阿拉伯文本。请参考bidi和arabic-reshaper的方法:https://stackoverflow.com/questions/67661330/how-to-fix-the-reversed-lines-when-using-arabic-reshaper-and-python-bidi-in-mul - Muneeb Ahmad Khurram

7
以下代码可行:
import arabic_reshaper

text_to_be_reshaped =  'اللغة العربية رائعة'

reshaped_text = arabic_reshaper.reshape(text_to_be_reshaped)

rev_text = reshaped_text[::-1]  # slice backwards 

print(rev_text)

请阅读[答案]并[编辑]您的答案,以包含有关此代码实际解决问题的说明。请记住,您不仅要解决问题,还要教育OP和任何未来读者。 - Adriaan

5

试试这个:

print u"ذهب الطالب الى المدرسة"

输出:

ذهب الطالب الى المدرسة

示例: https://repl.it/EuHM/0

默认的Python2.7字符串使用utf-8字符集。阿拉伯语不包含在utf-8中。因此,如果您在字符串前加上u,它将把该字符串视为Unicode字符串。


我得到了这个错误:UnicodeEncodeError:'ascii'编解码器不能对位置0-2的字符进行编码:超出范围(128) - Mohammed Sy
@MohammedSy 那个字符串的来源是什么?我也在使用Python2.7,但我没有遇到那个错误。 - Mohammad Yusuf
我从键盘输入了字符串,我认为这个问题不能通过代码解决,也许是我在Windows编码方面遇到了问题。 - Mohammed Sy
尝试这样做:print "ذهب الطالب الى المدرسة".encode('utf-8','ignore') - Mohammad Yusuf
@MohammedSy 也许你需要在第一行添加 # coding=utf-8,我在 repl.it 上尝试重新创建这个答案时遇到了这个问题: https://repl.it/@dralletje/Arabic-String#main.py - Michiel Dral

2
import sys
text = "اطبع هذا النص".encode("utf-8")

或者

text = "اطبع هذا النص".encode()

那么

sys.stdout.buffer.write(text)

输出

"اطبع هذا النص"

0

你有两个问题...首先,你正在使用非阿拉伯字体或非Unicode文本...其次,你需要一个像这样的函数来混合纯阿拉伯字母并给你混合的阿拉伯字母:

def mixARABIC(string2):
    import unicodedata
    string2 = string2.decode('utf8')
    new_string = ''
    for letter in string2:
        if ord(letter) < 256: unicode_letter = '\\u00'+hex(ord(letter)).replace('0x','')
        elif ord(letter) < 4096: unicode_letter = '\\u0'+hex(ord(letter)).replace('0x','')
        else: unicode_letter = '\\u'+unicodedata.decomposition(letter).split(' ')[1]
        new_string += unicode_letter
    new_string = new_string.replace('\u06CC','\u0649')
    new_string = new_string.decode('unicode_escape')
    new_string = new_string.encode('utf-8')
    return new_string

0
在Python 2.7中,你可以在文件的最顶部声明:

# -*- coding: utf-8 -*-
print "ذهب الطالب الى المدرسة"

更新:

如果您可以运行此代码:

# -*- coding: utf-8 -*-
s = "ذهب الطالب الى المدرسة"
with open("file.txt", "w", encoding="utf-8") as myfile:
    myfile.write(s)

如果生成的文件"file.txt"包含了正确的字符串,那么问题可能不是Python本身,而是你用来显示的东西。我猜你可以尝试在其他地方显示它,甚至可能是PyQt。


相同的问题: ط°ظ‡ط¨ ط§ظ„ط·ط§ظ„ط¨ ط§ظ„ظ‰ ط§ظ„ظ…ط¯ط±ط³ط© - Mohammed Sy
Python的print输出是由什么呈现的?Python可能正确地发出了Unicode,但这并不意味着将其转换为屏幕上的像素和符号的任何东西都能正确处理它。 - nigel222

0

你需要在你的代码前面添加一些行

import sys
reload(sys)
sys.setdefaultencoding('utf-8')  
print "ذهب الطالب الى المدرسة"

0

你可以像这样在字符串前加上u

print u"ذهب الطالب الى المدرسة"

或者使自己与Python3兼容,并将此代码放在文件顶部

from __future__ import unicode_literals

Python27中的字符串(或在Python3中称为字节串)不能处理Unicode字符。使用uimport语句可以使您的字符串与Unicode兼容。

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