python - कैसे जांचें कि पायथन में एक स्ट्रिंग ASCII में है या नहीं?




string unicode (10)

मैं यह जांचना चाहता हूं कि स्ट्रिंग ASCII में है या नहीं।

मैं ord() बारे में जानता हूं, हालांकि जब मैं ord('é') प्रयास करता हूं, तो मेरे पास TypeError: ord() expected a character, but string of length 2 found । मुझे समझ में आया कि जिस तरह से मैंने पायथन बनाया है (जैसा कि ord() के दस्तावेज़ में बताया गया है)।

जांचने का कोई और तरीका है?


@ रोजरडाहल के answer लेकिन चरित्र वर्ग को अस्वीकार करके और find_all या match बजाय खोज का उपयोग करके शॉर्ट-सर्किट के लिए यह अधिक कुशल है।

>>> import re
>>> re.search('[^\x00-\x7F]', 'Did you catch that \x00?') is not None
False
>>> re.search('[^\x00-\x7F]', 'Did you catch that \xFF?') is not None
True

मुझे लगता है कि इसके लिए एक नियमित अभिव्यक्ति अच्छी तरह अनुकूल है।


आप नियमित अभिव्यक्ति लाइब्रेरी का उपयोग कर सकते हैं जो पॉज़िक्स मानक [[: ASCII:]] परिभाषा स्वीकार करता है।


क्रैश से अपने कोड को रोकने के लिए, हो सकता है कि आप TypeErrors को पकड़ने के try-except एक try-except का उपयोग करना चाहें

>>> ord("¶")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found

उदाहरण के लिए

def is_ascii(s):
    try:
        return all(ord(c) < 128 for c in s)
    except TypeError:
        return False

पाइथन 2.6 (और पायथन 3.x में) से सिकंदर के समाधान को बेहतर बनाने के लिए आप सहायक मॉड्यूल curses.ascii का उपयोग कर सकते हैं और curses.ascii.isascii () फ़ंक्शन या अन्य कई का उपयोग कर सकते हैं: https://docs.python.org/2.6/library/curses.ascii.html

from curses import ascii

def isascii(s):
    return all(ascii.isascii(c) for c in s)

पायथन में एक स्टिंग ( str टाइप) बाइट्स की एक श्रृंखला है। केवल स्ट्रिंग को देखने से कहने का कोई तरीका नहीं है कि बाइट्स की यह श्रृंखला एएससीआई स्ट्रिंग का प्रतिनिधित्व करती है, 8-बिट वर्णमाला में एक स्ट्रिंग आईएसओ -885 9 -1 या यूटीएफ -8 या यूटीएफ -16 के साथ एन्कोडेड स्ट्रिंग या जो भी हो ।

हालांकि यदि आप एन्कोडिंग का उपयोग करते हैं, तो आप स्ट्रिंग को यूनिकोड स्ट्रिंग में decode कर सकते decode और फिर यह जांचने के लिए नियमित अभिव्यक्ति (या एक लूप) का उपयोग कर सकते हैं कि इसमें उस सीमा के बाहर वर्ण हैं या नहीं, जिसके बारे में आप चिंतित हैं।


भविष्य में संदर्भ के लिए हाल ही में इस तरह कुछ में भाग लें

import chardet

encoding = chardet.detect(string)
if encoding['encoding'] == 'ascii':
    print 'string is in ascii'

जिसका आप उपयोग कर सकते हैं:

string_ascii = string.decode(encoding['encoding']).encode('ascii')

मुझे लगता है कि आप सही सवाल नहीं पूछ रहे हैं--

पायथन में एक स्ट्रिंग में 'ascii', utf-8, या किसी अन्य एन्कोडिंग से संबंधित कोई संपत्ति नहीं है। आपकी स्ट्रिंग का स्रोत (चाहे आप इसे फ़ाइल से पढ़ते हैं, कीबोर्ड से इनपुट इत्यादि) हो सकता है कि आपकी स्ट्रिंग का उत्पादन करने के लिए एसीआईआई में यूनिकोड स्ट्रिंग को एन्कोड किया हो, लेकिन यही वह जगह है जहां आपको उत्तर के लिए जाना होगा।

शायद आप जो सवाल पूछ सकते हैं वह है: "क्या यह स्ट्रिंग एसीसीआई में एक यूनिकोड स्ट्रिंग एन्कोडिंग का परिणाम है?" - यह आप कोशिश कर जवाब दे सकते हैं:

try:
    mystring.decode('ascii')
except UnicodeDecodeError:
    print "it was not a ascii-encoded unicode string"
else:
    print "It may have been an ascii-encoded unicode string"

मैं यह निर्धारित करने के लिए निम्न का उपयोग करता हूं कि स्ट्रिंग एएससीआई या यूनिकोड है या नहीं:

>> print 'test string'.__class__.__name__
str
>>> print u'test string'.__class__.__name__
unicode
>>> 

फिर फ़ंक्शन को परिभाषित करने के लिए बस एक सशर्त ब्लॉक का उपयोग करें:

def is_ascii(input):
    if input.__class__.__name__ == "str":
        return True
    return False

विन्सेंट str.decode का सही विचार है, लेकिन पायथन 3 में str.decode को हटा दिया गया है। पायथन 3 में आप str.encode साथ एक ही परीक्षण कर सकते हैं:

try:
    mystring.encode('ascii')
except UnicodeEncodeError:
    pass  # string is not ascii
else:
    pass  # string is ascii

ध्यान दें कि आप जिस अपवाद को पकड़ना चाहते हैं उसे UnicodeDecodeError से UnicodeDecodeError में भी बदल दिया गया है।


def is_ascii(s):
    return all(ord(c) < 128 for c in s)




ascii