8

次のコードは、文字列内の文字がすべて漢字かどうかをテストします。Python 3 では機能しますが、Python 2.7 では機能しません。Python 2.7 でそれを行うにはどうすればよいですか?

for ch in name:
    if ord(ch) < 0x4e00 or ord(ch) > 0x9fff:
        return False
4

2 に答える 2

12
#  byte str (you probably get from GAE)
In [1]: s = """Chinese (汉语/漢語 Hànyǔ or 中文 Zhōngwén) is a group of related
        language varieties, several of which are not mutually intelligible,"""

#  unicode str
In [2]: us = u"""Chinese (汉语/漢語 Hànyǔ or 中文 Zhōngwén) is a group of related
        language varieties, several of which are not mutually intelligible,"""

#  convert to unicode using str.decode('utf-8')    
In [3]: print ''.join(c for c in s.decode('utf-8') 
                   if u'\u4e00' <= c <= u'\u9fff')
汉语漢語中文

In [4]: print ''.join(c for c in us if u'\u4e00' <= c <= u'\u9fff')
汉语漢語中文

すべての文字が中国語であることを確認するには、次のようにする必要があります。

all(u'\u4e00' <= c <= u'\u9fff' for c in name.decode('utf-8'))

Python アプリケーションでは、Unicode を内部的に使用します - 早めにデコードし、遅くエンコードします - Unicode サンドイッチを作成します。

于 2013-05-08T13:32:51.010 に答える
5

これは Python 2.7 で問題なく動作します。値nameは次のunicode()とおりです。

>>> ord(u'\u4e00') < 0x4e00
False
>>> ord(u'\u4dff') < 0x4e00
True

ord文字を Unicode 値と直接比較する場合は、ここで使用する必要はありません。

>>> u'\u4e00' < u'\u4e00'
False
>>> u'\u4dff' < u'\u4e00'
True

着信リクエストからのデータはまだ Unicode にデコードされていないため、最初にそれを行う必要があります。form タグに属性を明示的に設定しaccept-charsetて、ブラウザが正しいエンコーディングを使用するようにします。

<form accept-charset="utf-8" action="...">

次に、サーバー側でデータをデコードします。

name = self.request.get('name').decode('utf8')
于 2013-05-08T13:14:43.110 に答える