2016-03-09 12 views

ответ

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

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

Другой вариант:

>>> 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

Я думаю, что это всегда приведет к созданию всего списка? Он использует больше памяти и будет медленнее, если первый символ является символом> 0x80, так как он продолжает итерацию по всей строке (что не имеет большого значения в * большинстве * приложений, но делает это в * some *). – Carpetsmoker

+1

@Carpetsmoker> Я думаю, что это всегда создаст целый список? <Нет, не будет. Выражение внутри 'all' является генератором, который передает символы один за другим. – warvariuc

+0

Хорошо, спасибо ;-) – Carpetsmoker

1

Если у вас есть юникод строки вы можете использовать «кодировать», а затем устранить исключение:

try: 
    mynewstring = mystring.encode('ascii') 
except UnicodeEncodeError: 
    print("there are non-ascii characters in there") 

Если у вас есть байты, вы можете импортировать модуль chardet и проверить кодировку:

import chardet 

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

Вы должны поймать ошибку 'UnicodeDecodeError', которую вы ожидаете, а не базовый класс« Исключение ». Подумайте, что произойдет, если по какой-либо причине 'chardet.detect' не имеет ключа' encoding', или '' mystring'' будет 'list' или' int'. – Carpetsmoker

0

Обходной к вашей проблеме было бы попробовать и закодировать строку в определенной кодировке.

Например:

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

Это отбросит следующее сообщение об ошибке:

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) 

Теперь вы можете поймать «UnicodeDecodeError», чтобы определить, что строка не содержит только символы ASCII.

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

Это будет работать, только если вы кодируете 'ascii'. – Nimitz14

1

Вы также можете выбрать регулярное выражение для проверки только символов ascii. [\x00-\x7F] может совпадать с одним символом ascii:

>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None 
>>> OnlyAscii('string') 
True 
>>> OnlyAscii('Tannh‰user') 
False 
Смежные вопросы