Проверка строки на ASCII в Python: альтернатива ord()

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для определения строки ASCII в Python 3.7 и более новых версиях, можно использовать встроенный метод isascii():

Python
Скопировать код
print("ASCII" if my_string.isascii() else "Не ASCII")

В более ранних версиях Python проверка осуществляется посредством метода кодирования:

Python
Скопировать код
print("ASCII" if my_string.encode('ascii', 'ignore') == my_string.encode() else "Не ASCII")

В зависимости от версии Python и потребности в совместимости с предыдущими версиями при необходимости может использоваться ассоциированный с строки метод .isascii() или метод encode().

Кинга Идем в IT: пошаговый план для смены профессии

Работа со строками в Python

Работая со строками в Python, следует помнить, что они по умолчанию разрабатываются как последовательности символов Unicode.

Чтобы проверить соответствие строки стандарту ASCII, можно использовать str.isascii() в Python версии 3.7 и выше.

Использование decode() и исключений

Функция decode() может быть использована для проверки, является ли строка ASCII-кодированной.

Python
Скопировать код
try:
    my_string.decode('ascii')
    print("ASCII")
except UnicodeDecodeError:
    print("Не ASCII")

В данном случае, попытка декодировать строку в ASCII выдаст исключение, если строка не соответствует этому формату.

Встроенная функция ord()

Функция ord() проверяет каждый символ строки на принадлежность к диапазону ASCII.

Python
Скопировать код
is_ascii = all(ord(c) < 128 for c in my_string)

Погружаемся глубже – понимаем происхождение вашей строки

Понимание как была сгенерирована строка важно для определения подхода к её кодированию.

Дополнительные способы и особые случаи

Существуют и другие методы для работы с ASCII кодировкой.

В мире кодировок

Python
Скопировать код
is_ascii = len(my_string) == len(my_string.encode())

Сравнивая длину строки и длину её кодированного представления, можно проверить соответствие строки ASCII.

Визуализация

Представьте строку как пассажира в аэропорту ASCII:

Markdown
Скопировать код
Регистрация в аэропорту ASCII (✈️): "Только 128 основных пассажиров (0-127), пожалуйста!"

Проверка на безопасность:

Python
Скопировать код
boarding_pass = all(ord(c) < 128 for c in string)

Кто может сесть на борт:

Markdown
Скопировать код
Строка: "hello"    Посадка одобрена: ✅
Строка: "café"     Посадка отклонена: ❌

На борту – только ASCII.

Глубокое погружение – рассмотрим Unicode

Метод encode() с опцией 'ignore' используется для пропуска символов, которые не относятся к ASCII:

Python
Скопировать код
ascii_string = my_string.encode('ascii', 'ignore')
is_ascii = ascii_string.decode('ascii') == my_string

Снова обратимся к функции ord()

Проверяем каждый символ, используя ord(c) < 128:

Python
Скопировать код
for c in my_string:
    if ord(c) >= 128:
        print(f"Обнаружен символ не-ASCII: {c}")
        break

Продвинутый подход: нормализация Unicode

Нормализация обеспечивает единообразное кодирование визуально идентичных строк Unicode. В контексте ASCII это имеет значение:

Python
Скопировать код
import unicodedata
normalized_string = unicodedata.normalize('NFD', my_string)
is_ascii = normalized_string.isascii()

Производится нормализация к формату 'NFD'.

Полезные материалы

  1. Встроенные типы — Документация Python 3.12.2
  2. Как проверить, является ли строка в Python строкой ASCII? – Stack Overflow
  3. Детальный разбор Unicode — Документация Python 3.12.2
  4. Таблица ASCII – Коды символов ASCII
  5. Часто задаваемые вопросы о UTF-8 и Unicode
  6. Строки — Руководство по портированию Python 3 версии 1.0