2016-03-09 42 views

Trả lời

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

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

Một phiên bản:

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

Tôi nghĩ điều này sẽ luôn tạo toàn bộ danh sách? Nó sử dụng nhiều bộ nhớ hơn và sẽ chậm hơn nếu ký tự đầu tiên là ký tự> 0x80 vì nó tiếp tục lặp qua toàn bộ chuỗi (không quan trọng quá nhiều trong * ứng dụng * nhiều nhất, nhưng trong * một số *). – Carpetsmoker

+1

@Carpetsmoker> Tôi nghĩ điều này sẽ luôn tạo ra toàn bộ danh sách? warvariuc

+0

Được rồi, cảm ơn ;-) – Carpetsmoker

1

Nếu bạn có các chuỗi unicode bạn có thể sử dụng chức năng "mã hóa" và sau đó bắt ngoại lệ:

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

Nếu bạn có byte, bạn có thể nhập mô-đun chardet và kiểm tra mã hóa:

import chardet 

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

Bạn nên nắm bắt lỗi 'UnicodeDecodeError' mà bạn đang mong đợi, không phải lớp cơ sở' Ngoại lệ '. Hãy xem điều gì sẽ xảy ra nếu vì lý do gì đó 'chardet.detect' không có khóa' encoding', hoặc nếu 'mystring' sẽ là' list' hoặc 'int'. – Carpetsmoker

0

Giải pháp cho vấn đề của bạn là thử và mã hóa chuỗi trong một mã hóa cụ thể.

Ví dụ:

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

này sẽ ném các lỗi sau:

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) 

Bây giờ bạn có thể nắm bắt được "UnicodeDecodeError" để xác định rằng chuỗi không chỉ chứa các ký tự ASCII.

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

Điều này sẽ chỉ hoạt động nếu bạn mã hóa với 'ascii'. – Nimitz14

1

Bạn cũng có thể chọn regex chỉ kiểm tra ký tự ascii. [\x00-\x7F] có thể khớp với một ký tự ascii đơn lẻ:

>>> OnlyAscii = lambda s: re.match('^[\x00-\x7F]+$', s) != None 
>>> OnlyAscii('string') 
True 
>>> OnlyAscii('Tannh‰user') 
False 
Các vấn đề liên quan