2013-05-08 13 views
7

Il seguente codice verifica se i caratteri in una stringa sono tutti caratteri cinesi. Funziona con Python 3 ma non con Python 2.7. Come faccio a farlo in Python 2.7?Python 2.7: verifica se i caratteri in una stringa sono tutti caratteri cinesi

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

È 'name' una stringa unicode o una stringa di byte? Non devi usare 'ord' qui, btw:' se ch u '\ u9fff': 'funziona anche. –

+1

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

risposta

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

per assicurarsi che tutte le i caratteri sono cinesi, qualcosa del genere dovrebbe fare:

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

Nel tuo pitone un pplication, usa unicode internamente - decodifica in anticipo la codifica & in ritardo - creando uno unicode sandwich.

+0

Solo un commento - piuttosto che decodificare in un valore nonce, potrebbe essere meglio memorizzare l'oggetto unicode decodificato e lavorare internamente con unicode. – Marcin

+0

@Marcin - Hai perfettamente ragione, aggiungerai una nota, grazie. – root

5

Questo funziona bene per me in Python 2.7, fornito name è un unicode() valore:

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

Non è necessario usare ord qui se si confronta il personaggio direttamente con valori Unicode:

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

I dati di una richiesta in entrata non sono stati ancora decodificati o unicode, devi prima farlo. Esplicitamente impostare l'attributo accept-charset sul tag form per garantire che il browser utilizza la codifica corretta:

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

poi decodificare i dati sul lato server:

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

I sto lavorando su Google App Engine con Python. Il 'nome' è ottenuto da' name = self.request.get ('name') 'da un modulo, e l'utente deve inserire solo caratteri cinesi. Devo convertire 'name' in unicode? E come? –

+1

@Tang: Sì, prima dovresti convertire i dati in Unicode. I browser di solito usano la codifica della pagina HTML, quindi se pubblichi le tue pagine con Content-Type: text/html; charset = utf8' quindi puoi assumere che puoi anche decodificare come UTF-8. –

Problemi correlati