2016-03-09 23 views

Antwort

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

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

Eine andere Version:

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

Ich denke, das wird immer eine ganze Liste erstellen? Es verwendet mehr Speicher und wird langsamer, wenn das erste Zeichen ein Zeichen> 0x80 ist, da es über die gesamte Zeichenfolge iteriert (was in * den meisten * Anwendungen nicht so wichtig ist, aber in * einigen *). – Carpetsmoker

+1

@Carpetsmoker> Ich denke, das wird immer eine ganze Liste erstellen? warvariuc

+0

Okay, danke ;-) – Carpetsmoker

1

Wenn Sie Unicode-Strings haben, können Sie verwenden die "encode" -Funktion und dann die Ausnahme abfangen:

Wenn Sie Bytes haben, können Sie das chardet Modul importieren und die Codierung überprüfen:

import chardet 

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

Sie sollten den 'UnicodeDecodeError' Fehler, den Sie erwarten, nicht die Basis 'Exception'-Klasse abfangen. Überlegen Sie, was passieren würde, wenn 'chardet.detect' aus irgendeinem Grund keinen 'encoding'-Schlüssel hat oder wenn' mystring' eine' list' oder 'int' wäre. – Carpetsmoker

0

Eine Abhilfe für Ihr Problem der Zeichenfolge in einer bestimmten Codierung zu versuchen wäre und zu codieren.

Zum Beispiel:

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

Dies wird den folgenden Fehler aus:

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) 

Jetzt können Sie die „UnicodeDecodeError“ fangen, um festzustellen, dass die Zeichenfolge nicht nur die ASCII-Zeichen enthalten haben.

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

Dies funktioniert nur, wenn Sie mit Ascii kodieren. – Nimitz14

1

Sie können sich auch für Regex entscheiden, um nur ASCII-Zeichen zu überprüfen. kann ein einzelnes ASCII-Zeichen:

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