3

今は夏なので、新しい言語を学ぶことに決め、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 が常にアラビア文字を認識できるようにするには、何を変更する必要がありますか?

4

4 に答える 4

4

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 ページをお勧めします。

于 2012-06-24T08:18:39.080 に答える
3

Python 3.x を使用してください: 文字列が Unicode になりました - Python 3 の新機能を参照してください

>>> abook = 'القاموس العربي'
>>> abook[0]
'ا'
>>> abook[4]
'م'
于 2012-06-24T08:24:23.890 に答える
1

入力が必要な場合:

>>> 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]
ق
于 2012-06-24T08:32:35.087 に答える
0

質問に対するコメントの結果を見ると、これはモジバケreprの問題を引き起こしているようです。つまり、エンコーディングについて混乱し、間違ったものを使用しているようです。STDOUT が使用すると思われるエンコーディングを使用して、結果のバイトを直接出力しようとします - repr は ASCII セーフ表現を出力しようとしますが、この状況ではひどく失敗しているようです。print

幸いなことに、これは の問題でreprあり、Python の Unicode 処理の問題ではありません。roundtrip: が機能する限り、s.encode('utf8').decode('utf8') == s問題ありません。print値を調べたいときは、対話型ターミナルで言及するだけでなく、あらゆる場所で Unicode 文字列を使用してください (Py3 を使用すると、これに大いに役立ちます。少なくとも、次のことを行う必要があります。

from __future__ import unicode_literals
from io import open

)、エンコーディングを追跡しておけば、repr何か奇妙なことをしたとしても、プログラムは機能します。

また、あなたの質問は決してUTF8に関するものではないことに注意してください.Unicodeに関するものであり、これは別の(関連していますが)概念です。これまで読んできたリソースがこの違いを強制していない場合は、より優れたリソースを入手してください。これらの概念を誤解していると、多くの苦痛が生じます。

于 2012-06-24T11:05:46.117 に答える