2016-03-09 24 views

cevap

7
>>> all(ord(char) < 128 for char in 'string') 
>>> True 

>>> all(ord(char) < 128 for char in 'строка') 
>>> False 

Başka bir sürümü ascii olup olmadığını söylemek mümkün istiyorum

: Eğer unicode dizeleri varsa

>>> def is_ascii(text): 
    if isinstance(text, unicode): 
     try: 
      text.encode('ascii') 
     except UnicodeEncodeError: 
      return False 
    else: 
     try: 
      text.decode('ascii') 
     except UnicodeDecodeError: 
      return False 
    return True 
... 

>>> is_ascii('text') 
>>> True 

>>> is_ascii(u'text') 
>>> True 

>>> is_ascii(u'text-строка') 
>>> False 

>>> is_ascii('text-строка') 
>>> False 

>>> is_ascii(u'text-строка'.encode('utf-8')) 
>>> False 
+0

Ben bu her zaman bütün bir liste oluşturmak düşünüyorum: [\x00-\x7F] tek ASCII karakter eşleşebilir? Daha fazla bellek kullanır ve ilk karakter> 0x80 karakteriyse, daha yavaş olacaktır, çünkü tüm dizgede yineleme yapmaya devam eder (bu, * en * uygulamalarında çok fazla önemli değildir, ancak * bazılarında *). – Carpetsmoker

+1

@Carpetsmoker> Bence bu her zaman bir liste oluşturacak mı? warvariuc

+0

Tamam, teşekkürler ;-) – Carpetsmoker

1

kullanabilirsiniz işlevini kodlayın ve sonra özel durumu yakalayın: ( Eğer bayt varvarsa, Chardet modülü almak ve kodlama kontrol edebilirsiniz:

import chardet 

# Get the encoding 
enc = chardet.detect(mystring)['encoding'] 
+0

'da uygulanmaktadır. "Exception" sınıfını değil, beklediğiniz 'UnicodeDecodeError 'hatasını yakalamalısınız. Hangi nedenle olursa olsun 'chardet.detect' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'tuşuna sahip değilse ya da' 'mistring'''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''''''. – Carpetsmoker

0

senin sorunun geçici denemek ve belirli kodlamasında dize kodlamak için olacaktır. Örneğin

:

'H€llø'.encode('utf-8') 

Bu, aşağıdaki hata atar:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128) 

Şimdi dize sadece ASCII karakterleri içermiyordu belirlemek için "UnicodeDecodeError" yakalayabilirsiniz.

try: 
    'H€llø'.encode('utf-8') 
except UnicodeDecodeError: 
    print 'This string contains more than just the ASCII characters.' 
+0

Bu yalnızca "ascii" ile kodlarsanız çalışır. – Nimitz14

1

Sadece ascii karakterlerini kontrol etmek için normal ifadeyi seçebilirsiniz.

>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None 
>>> OnlyAscii('string') 
True 
>>> OnlyAscii('Tannh‰user') 
False 
İlgili konular