在Python中使用UTF-8工作(Working with UTF-8 in Python)

2019-07-30 02:35发布

因为它是现在夏天,我决定学一门新的语言和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始终承认阿拉伯字母?

Answer 1:

使用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的页面这是短期,实用和有用的。



Answer 2:

使用Python 3.X:字符串现在是Unicode的看到蟒蛇3是什么新

>>> abook = 'القاموس العربي'
>>> abook[0]
'ا'
>>> abook[4]
'م'


Answer 3:

如果你想输入:

>>> 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]
ق


Answer 4:

由结果在对这个问题的意见走,这看起来像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,这是一个不同的(虽然相关)的概念。 如果您已经阅读资源没有执行这种差异,获得更好的资源 - 这些概念的误解会带你到很多的痛苦。



文章来源: Working with UTF-8 in Python