因为它是现在夏天,我决定学一门新的语言和Python是我的选择。 说真的,我想了解的是如何使用Python操作阿拉伯文字。 现在,我已经在使用Python,这是真正伟大的发现了很多很多的资源。 然而,当我申请我的阿拉伯语字符串了解到,我得到的数字和字母结合在一起。
就拿这个英文:
>>> ebook = 'The American English Dictionary'
>>> ebook[2]
'e'
现在,阿拉伯语:
>>> abook = 'القاموس العربي'
>>> abook[2]
'\xde' #the correct output should be 'ق'
然而,使用print
工作正常,如:
>>> print abook[2]
ق
我需要做什么修改让Python始终承认阿拉伯字母?
使用Unicode明确:
>>> s = u'القاموس العربي'
>>> s
u'\u0627\u0644\u0642\u0627\u0645\u0648\u0633 \u0627\u0644\u0639\u0631\u0628\u064a'
>>> print s
القاموس العربي
>>> print s[2]
ق
甚至逐个字符:
>>> for i, c in enumerate(s):
... print i,c
...
0 ا
1 ل
2 ق
3 ا
4 م
5 و
6 س
7
8 ا
9 ل
10 ع
11 ر
12 ب
13 ي
14
我建议Python的Unicode的页面这是短期,实用和有用的。
使用Python 3.X:字符串现在是Unicode的看到蟒蛇3是什么新
>>> abook = 'القاموس العربي'
>>> abook[0]
'ا'
>>> abook[4]
'م'
如果你想输入:
>>> abook[2]
以产生以下输出:
'ق'
它永远不会发生。 交互式壳打印repr(abook[2])
这将始终使用阿拉伯字符转义序列。 我不知道确切的规则,但我猜的ASCII宇宙之外的大多数字符都将被转义。 为了使其工作作为标榜,你使用u
前缀,但它仍然会输出一个转义序列(虽然是正确的,这个时间):
>>> abook = u'القاموس العربي'
>>> abook[2]
u'\u0642'
你之所以'\xde'
是没有u
前缀,ABOOK持有短语的UTF-8编码。 我的输出跟你不一样(可能是因为代码点是通过复制粘贴涂改的;我不知道),但原则仍适用:
>>> abook = 'القاموس العربي'
>>> ' '.join( hex(ord(c))[-2:] for c in abook )
'd8 a7 d9 84 d9 82 d8 a7 d9 85 d9 88 d8 b3 20 d8 a7 d9 84 d8 b9 d8 b1 d8 a8 d9 8a'
>>> abook[2]
'\xd9'
您可以证实这一点,如下所示:
>>> abook = 'القاموس العربي'
>>> unicode(abook, 'utf-8')[2]
u'\u0642'
>>> print unicode(abook, 'utf-8')[2]
ق
由结果在对这个问题的意见走,这看起来像repr
是造成变为乱码的问题-也就是说,它是越来越困惑编码和用错了一个。 print
将尝试使用它认为你的标准输出使用的编码,并直接打印生成的字节-再版尝试打印的ASCII安全表示,虽然似乎是在这种情况下严重失败。
好消息是-这是一个问题repr
,而不是与Python的Unicode的处理。 只要往返: s.encode('utf8').decode('utf8') == s
的作品,你的罚款。 print
的值时,要检查它,不要只提它在Interative的终端,并在任何地方使用Unicode字符串(使用PY3将大量解决这个问题,或者至少做到:
from __future__ import unicode_literals
from io import open
),跟踪编码的,如果你的程序会甚至工作repr
情况做一些奇怪的。
另外请注意,你的问题是不是 UTF8以任何方式-其有关Unicode,这是一个不同的(虽然相关)的概念。 如果您已经阅读资源没有执行这种差异,获得更好的资源 - 这些概念的误解会带你到很多的痛苦。