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']
['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']
我正在使用 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']
['اقترح', 'احداث', 'موسس', 'راد', 'تسيس', 'احداث']