我使用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']
答案 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并且无效。