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

Python storing Arabic in an Array?

我正在使用 python V2.7,我有一个数组 ArbSyn,它有阿拉伯语字符串,但它们存储为 unicode,我想将它们转换为普通阿拉伯语字母并将它们存储在数组 ArbSynFinal 中。当我打印 encoded 时,它以阿拉伯字母打印,但是当我使用 ArbSynFinal.append()[ 将其存储在 ArbSynFinal 中时=22=] 并打印出来,它又是 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']

注意这是Python2.7

这是因为 ArbSynFinal 在您进行打印时使用默认输出编码。因此,您需要使用(如您在问题中发现的那样)

print ArbSynFinal.encode('utf-8')

但是,如果您想避免每次都必须这样做,您可以创建一个函数 myprint(output) 并在您想要打印时调用它。

def myprint(text):
    print text.encode('utf-8')

myprint(output)

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

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

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

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

import sys
print sys.stdout.encoding

这个我也找到了,不知道行不行。我无法找到证明这行不通的参考资料。

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

感谢@MarkTolonen 指出 setdefaultencoding breaks code 并且不会起作用。

打印列表使用列表中项目的 repr(),它总是在 Python 上显示 Unicode 转义 2. 切换到 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)

输出:

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

如果您声明源文件的编码,您也可以直接在源文件中输入阿拉伯字符。您仍然可以 repr() 在 Python 2 上打印一个列表,如果您想正确打印它,仍然需要为该列表构建一个 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']
['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']