Python在数组中存储阿拉伯语?

时间:2016-02-17 18:48:05

标签: python python-2.7 unicode arabic

我使用python V2.7,我有一个数组 ArbSyn ,它有阿拉伯字符串,但它们存储为unicode,我想将它们转换为普通的阿拉伯字母并将它们存储在数组中 ArbSynFinal 即可。当我打印编码时,用阿拉伯字母打印但是当我使用 ArbSynFinal.append()将其存储在 ArbSynFinal 中并打印出来时,它在unicode中再次,我该如何解决这个问题?

 print("----ArbSyn----")
print ArbSyn
ArbSynFinal=[]
for bca in ArbSyn: #Converting from unicode to arabic done
    encoded=bca.encode('utf-8')#this works fine
    encoded= u"".join([c for c in bca if not unicodedata.combining(c)])
    print encoded
    ArbSynFinal.append(encoded)
print("------Arb Syn Final----------")
print ArbSynFinal

这是输出:

----ArbSyn----
[u'\u0627\u0642\u062a\u0631\u062d', u'\u0627\u062d\u062f\u0627\u062b', u'\u0645\u0648\u0633\u0633', u'\u0631\u0627\u062f', u'\u062a\u0633\u064a\u0633', u'\u0627\u062d\u062f\u0627\u062b',]
اقترح
احداث
موسس
راد
تسيس
احداث

------Arb Syn Final----------
[u'\u0627\u0642\u062a\u0631\u062d', u'\u0627\u062d\u062f\u0627\u062b', u'\u0645\u0648\u0633\u0633', u'\u0631\u0627\u062f', u'\u062a\u0633\u064a\u0633', u'\u0627\u062d\u062f\u0627\u062b']

2 个答案:

答案 0 :(得分:3)

打印列表使用列表中repr()项,这些项始终显示Python 2上的Unicode转义。切换到Python 3,列表将显示(可打印)Unicode字符或构建您自己的列表表示。始终将Unicode字符串直接打印到终端,而不尝试对其进行编码。如果终端支持这些字符,它将正确显示,无论终端是使用UTF-8还是阿拉伯传统编码,如Windows-1256

#!python2
ArbSyn = [u'\u0627\u0642\u062a\u0631\u062d', u'\u0627\u062d\u062f\u0627\u062b', u'\u0645\u0648\u0633\u0633', u'\u0631\u0627\u062f', u'\u062a\u0633\u064a\u0633', u'\u0627\u062d\u062f\u0627\u062b']

# Demonstrate the difference printing an item vs. its representation
for item in ArbSyn:
    print item,repr(item)

# Build a Unicode string representation of a list
as_list = u"['" + u"', '".join(ArbSyn) + u"']"
print as_list

输出:

اقترح u'\u0627\u0642\u062a\u0631\u062d'
احداث u'\u0627\u062d\u062f\u0627\u062b'
موسس u'\u0645\u0648\u0633\u0633'
راد u'\u0631\u0627\u062f'
تسيس u'\u062a\u0633\u064a\u0633'
احداث u'\u0627\u062d\u062f\u0627\u062b'
['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']

Python 3:

#!python3
ArbSyn = ['\u0627\u0642\u062a\u0631\u062d', '\u0627\u062d\u062f\u0627\u062b', '\u0645\u0648\u0633\u0633', '\u0631\u0627\u062f', '\u062a\u0633\u064a\u0633', '\u0627\u062d\u062f\u0627\u062b']
print(ArbSyn)

输出:

['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']

如果您声明源文件的编码,您也可以直接在源代码中输入阿拉伯字符。您仍然可以在Python 2上打印repr()列表,如果要正确打印,仍然需要为列表构建Unicode字符串。

#!python2
#coding:utf8
ArbSyn = [u'اقترح', u'احداث', u'موسس', u'راد', u'تسيس', u'احداث']
print ArbSyn
print u"['" + u"', '".join(ArbSyn) + u"']"

输出:

[u'\u0627\u0642\u062a\u0631\u062d', u'\u0627\u062d\u062f\u0627\u062b', u'\u0645\u0648\u0633\u0633', u'\u0631\u0627\u062f', u'\u062a\u0633\u064a\u0633', u'\u0627\u062d\u062f\u0627\u062b']
['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']

答案 1 :(得分:1)

请注意,这是Python 2.7

这是因为ArbSynFinal在执行打印时使用默认输出编码。因此,您需要使用(如问题中所示)

myprint(output)

但是,如果您想避免每次都这样做,您可以创建一个函数def myprint(text): print text.encode('utf-8') myprint(output) ,并在您想要进行打印时调用它。

import sys
import codecs
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

Python: How is sys.stdout.encoding chosen?有一个重置默认编码的示例。

import sys
print sys.stdout.encoding

这似乎适用于基本测试。但是,我无法访问该网站。

另一种可能性是将环境变量“PYTHONIOENCODING”更改为“utf_8”。这将重置sys.stdout.encoding

import sys
stdin, stdout = sys.stdin, sys.stdout
reload(sys)
sys.stdin, sys.stdout = stdin, stdout
sys.setdefaultencoding('utf-8')

我也发现了这个,但我不知道它是否有效。我无法得到证明这不起作用的参考文献。

{{1}}

感谢@MarkTolonen指出setdefaultencoding breaks code并且无效。