2013-05-08 4 views
7

次のコードは、文字列内の文字がすべて中国語文字であるかどうかをテストします。 Python 3では動作しますが、Python 2.7では動作しません。 Python 2.7でどうすればいいですか? nameを提供Python 2.7:文字列内の文字がすべて中国語文字であるかどうかをテストする

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

'name'はユニコード文字列かバイト文字列ですか?ここで 'ord'を使う必要はありません.btw:' ch u '\ u9fff': 'も使えます。 –

+1

関連:http://stackoverflow.com/questions/16027450/is-there-a-way-to-know-whether-a-unicode-string-contains-any-chinese-japanese-ch/16028174#16028174 – Daenyth

答えて

11
# 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') 
汉语漢語中文 

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

、サーバ側のデータをデコード文字は中国語ですが、これは次のようなものです:

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

あなたのPythonではpplicationは、内部でユニコードを使用します。&エンコードは遅く、unicode sandwichを作成します。

+0

1つのコメント - ノンス値にデコードするのではなく、デコードされたユニコードオブジェクトを格納し、ユニコードで内部的に作業する方がよい場合があります。 – Marcin

+0

@Marcin - あなたは絶対に正しいです、メモを追加します、ありがとう。 – root

5

これは、Python 2.7で私のために正常に動作し、があるunicode()

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

あなたはユニコード値で直接文字を比較する場合は、ここordを使用する必要はありません。

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

着信要求のデータはまだ復号されていません。あなたが最初にそれを行う必要があります。明示的にブラウザが正しいエンコーディングを使用していることを確認するために、フォームタグにaccept-charset属性を設定:すべてを確認するために

name = self.request.get('name').decode('utf8') 
+1

I Google App EngineでPythonを使用しています。 'name'はフォームから' name = self.request.get( 'name') 'によって得られ、ユーザは漢字のみを入力する必要があります。 'name'をユニコードに変換する必要がありますか?そしてどうやって? –

+1

@Tang:はい、まずデータをUnicodeに変換する必要があります。ブラウザは通常、HTMLページのエンコーディングを使用します。したがって、あなたのページに 'Content-Type:text/html; charset = utf8'とすると、UTF-8としてもデコードできると仮定できます。 –

関連する問題