Как проверить, находится ли строка в Python в ASCII?

Я хочу проверить, есть ли строка в ASCII или нет.

Я знаю ord() , однако, когда я пытаюсь ord('é') , у меня есть TypeError: ord() expected a character, but string of length 2 found . Я понял, что это вызвано тем, как я построил Python (как объясняется в документации ord() ).

Есть ли другой способ проверить?

  • Python: использование .format () в строке с экранированным Unicode
  • Функция python list () меняет на (я думаю) utf-8
  • unicode (). decode ('utf-8', 'ignore'), поднимающий UnicodeEncodeError
  • Как писать русские символы в файле?
  • UnicodeEncodeError: кодек «latin-1» не может кодировать символ
  • Как установить кодировку sys.stdout в Python 3?
  • Python - обработка файлов с смешанным кодированием
  • Python обнаруживает строковое байтовое кодирование
  • 15 Solutions collect form web for “Как проверить, находится ли строка в Python в ASCII?”

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

    Я думаю, вы не задаете правильный вопрос –

    Строка в python не имеет свойства, соответствующего «ascii», utf-8 или любой другой кодировке. Источник вашей строки (независимо от того, читаете ли вы ее из файла, вводите с клавиатуры и т. Д.), Может закодировать строку unicode в ascii для создания вашей строки, но здесь вам нужно найти ответ.

    Возможно, вы можете задать вопрос: «Является ли эта строка результатом кодирования строки unicode в ascii?» – Это вы можете ответить, попробовав:

     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" 

    Python 3 пути:

     isascii = lambda s: len(s) == len(s.encode()) 

    В последнее время появилось нечто подобное – для справок в будущем

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

    которые вы можете использовать с:

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

    Ваш вопрос неверен; ошибка, которую вы видите, не является результатом того, как вы построили python, но из-за путаницы между строками байтов и строками Unicode.

    Байт-строки (например, «foo» или «bar» в синтаксисе python) – это последовательности октетов; номера от 0 до 255. Строки Unicode (например, u "foo" или u'bar ') – это последовательности кодов Unicode; номера от 0-1112064. Но вам кажется, что вас интересует символ é, который (в вашем терминале) является многобайтовой последовательностью, которая представляет один символ.

    Вместо ord(u'é') попробуйте следующее:

     >>> [ord(x) for x in u'é'] 

    Это говорит вам, какая последовательность кодовых точек «é» представляет. Это может дать вам [233], или это может дать вам [101, 770].

    Вместо chr() чтобы отменить это, существует unichr() :

     >>> unichr(233) u'\xe9' 

    Этот символ может быть фактически представлен как один или несколько «кодовых точек» юникода, которые сами представляют либо графемы, либо символы. Это либо «e с острым акцентом (т. Е. Код 233)», либо «e» (код 101), а затем «острый акцент на предыдущем символе» (кодовая точка 770). Таким образом, этот тот же самый символ может быть представлен как структура данных Python u'e\u0301' или u'\u00e9' .

    В большинстве случаев вам не нужно заботиться об этом, но это может стать проблемой, если вы выполняете итерацию по строке юникода, поскольку итерация работает по кодовой точке, а не разложимым символом. Другими словами, len(u'e\u0301') == 2 и len(u'\u00e9') == 1 . Если это имеет значение для вас, вы можете конвертировать между сложенными и разложенными формами, используя unicodedata.normalize .

    Глоссарий Unicode может быть полезным руководством для понимания некоторых из этих проблем, указывая, как каждый конкретный термин относится к другой части представления текста, что намного сложнее, чем многие программисты понимают.

    Как насчет этого?

     import string def isAscii(s): for c in s: if c not in string.ascii_letters: return False return True 

    Я нашел этот вопрос, пытаясь определить, как использовать / кодировать / декодировать строку, чью кодировку я не был уверен (и как бежать / конвертировать специальные символы в эту строку).

    Мой первый шаг должен был проверить тип строки – я не понимал, что могу получить хорошие данные о его форматировании из типов (типов). Этот ответ был очень полезен и получил реальный корень моих проблем.

    Если вы получаете грубую и стойкую

    UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc3 в позиции 263: порядковый номер не в диапазоне (128)

    особенно когда вы являетесь ENCODING, убедитесь, что вы не пытаетесь выполнить unicode () строку, которая уже является unicode – по какой-то страшной причине вы получаете ошибки в коде ascii. (См. Также рецепт кухни Python и учебные пособия Python docs для лучшего понимания того, насколько это ужасно).

    В конце концов я решил, что то, что я хотел сделать, было следующим:

     escaped_string = unicode(original_string.encode('ascii','xmlcharrefreplace')) 

    Также полезной для отладки была установка кодировки по умолчанию в моем файле на utf-8 (поместите это в начало вашего файла python):

     # -*- coding: utf-8 -*- 

    Это позволяет вам проверять специальные символы ('àéç') без необходимости использовать их unicode-экраны (u '\ xe0 \ xe9 \ xe7').

     >>> specials='àéç' >>> specials.decode('latin-1').encode('ascii','xmlcharrefreplace') '&#224;&#233;&#231;' 

    У Винсента Маркетти есть правильная идея, но str.decode устарел в Python 3. В Python 3 вы можете сделать тот же тест с str.encode :

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

    Обратите внимание, что исключение, которое вы хотите уловить, также изменилось с UnicodeDecodeError на UnicodeEncodeError .

    Чтобы улучшить решение Александра из Python 2.6 (и в Python 3.x), вы можете использовать вспомогательный модуль curses.ascii и использовать функцию curses.ascii.isascii () или другие: https://docs.python.org/2.6/ библиотека / curses.ascii.html

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

    Вы можете использовать библиотеку регулярных выражений, которая принимает стандартное определение Posix [[: ASCII:]].

    Sting ( str type) в Python – это серия байтов. Нет никакого способа рассказать только о том, что эта серия байтов представляет собой строку ascii, строку в 8-битной кодировке, такую ​​как ISO-8859-1, или строку, кодированную UTF-8 или UTF-16, или что-то другое ,

    Однако, если вы знаете используемую кодировку, вы можете decode строку в строку юникода, а затем использовать регулярное выражение (или цикл), чтобы проверить, содержит ли он символы вне диапазона, о котором вы беспокоитесь.

    Чтобы предотвратить сбои в работе вашего кода, вы, возможно, захотите использовать try-except чтобы уловить TypeErrors

     >>> 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 
     import re def is_ascii(s): return bool(re.match(r'[\x00-\x7F]+$', s)) 

    Чтобы включить пустую строку как ASCII, измените значение + на * .

    Как ответ @ RogerDahl, но более эффективен для короткого замыкания, отрицая класс символов и используя поиск вместо 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 или unicode:

     >> 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 
    Python - лучший язык программирования в мире.