次のコードは、文字列内の文字がすべて漢字かどうかをテストします。Python 3 では機能しますが、Python 2.7 では機能しません。Python 2.7 でそれを行うにはどうすればよいですか?
for ch in name:
if ord(ch) < 0x4e00 or ord(ch) > 0x9fff:
return False
次のコードは、文字列内の文字がすべて漢字かどうかをテストします。Python 3 では機能しますが、Python 2.7 では機能しません。Python 2.7 でそれを行うにはどうすればよいですか?
for ch in name:
if ord(ch) < 0x4e00 or ord(ch) > 0x9fff:
return False
# 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 サンドイッチを作成します。
これは 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')