Решение ошибки SyntaxError: Non-ASCII character в Python

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

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

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

Чтобы избавиться от SyntaxError, возникающей вследствие наличия не-ASCII символов в файле, добавьте в его начало строку # -*- coding: utf-8 -*-. Это позволит интерпретатору Python воспринимать файл в кодировке UTF-8, которая включает ASCII и множество других символов.

Python
Скопировать код
# -*- coding: utf-8 -*-
Кинга Идем в IT: пошаговый план для смены профессии

Тайна не-ASCII символов

По умолчанию Python интерпретирует скрипты как ASCII-файлы. Встретив не-ASCII символ, например 'é' или последовательность \xe2, Python столкнется с SyntaxError, так как он не знает, как обработать эти символы. Это можно сравнить с нахождением страницы, написанной азбукой Морзе, посреди прозаической книги!

Как заставить Python понимать UTF-8

Верное решение — добавить в начало файла декларацию о кодировке UTF-8. Это позволит Python корректно интерпретировать как простые ASCII, так и особые символы.

Python
Скопировать код
# Обучение Python замечать эмодзи и особые символы через UTF-8!
# -*- coding: utf-8 -*-

Сохранение согласованности с UTF-8 в ходе работы

Настройте ваш текстовый редактор или IDE таким образом, чтобы они сохраняли и воспринимали файлы в кодировке UTF-8. Обычно эти опции доступны в настройках.

Python
Скопировать код
# Совет от программиста: настройте вашу IDE "говорить" на одном языке с вашим кодом!

Отслеживание незаметных не-ASCII символов

Не-ASCII символы могут непреднамеренно попасть в ваш код, в особенности при копировании из сети. Для выявления таких символов воспользуйтесь функцией поиска вашего редактора.

Python
Скопировать код
# Пора играть в детективов и отыскать этих скрытых не-ASCII непосредственно в коде!

Работа Python с Unicode

Python требует указание кодировки в файле для корректной работы с Unicode. Это обеспечивает глобальную совместимость разработки программного обеспечения и унификацию кода.

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

Сценарий в Python:

Вы написали текст на английском языке (📝) и добавили древние символы (🎭).

Markdown
Скопировать код
Ваш скрипт: 📝 + 🎭 = ❌
Ошибка: "SyntaxError: Не-ASCII символ '\xe2' в файле"

Что Python хотел бы:

Markdown
Скопировать код
**Без малознакомых символов, Python:**
📝 (Только английский/ASCII) = ✅

Но с декларацией UTF-8:

Python
Скопировать код
# -*- coding: utf-8 -*-

Python будет доволен:

Markdown
Скопировать код
📝 + 🎭 + 😊 (UTF-8) = ✅

Тогда Unicode, ASCII и Python мирно сосуществуют в мире UTF-8! 🌍🎉

Справляемся с распространенными проблемами кодировки

Копирование кода

При копировании кода с веб-страниц могут включаться не-ASCII символы, такие как кавычки или тире, которые могут выглядеть невинными, но не являются ASCII.

Определение не-ASCII символов

Для отыскания скрытых не-ASCII символов воспользуйтесь регулярными выражениями или инструментами для поиска и замены. Регулярное выражение [^\x00-\x7F] поможет их обнаружить.

Python
Скопировать код
# Регулярные выражения не только забавная терминология для гиков, они также очень полезны!

Соответствие кодировки файла

Убедитесь, что кодировка файла соответствует той, которая указана в скрипте. Если файл в кодировке ISO-8859-1 (Латиница-1), а в скрипте указана кодировка UTF-8, это может привести к проблемам. Стремитесь к единообразию кодировки файлов.

Работа с Unicode в разных версиях Python

Python 3 более продвинут в обработке Unicode по сравнению с его предшественником и по умолчанию интерпретирует файлы как UTF-8. Но явное указание кодировки обеспечит безошибочное функционирование вашего кода.

Python
Скопировать код
# Донести до Python свои намерения бывает сложно, как объяснить маме шутку 🙃

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

  1. PEP 263 – Определение кодировок исходного кода Python
  2. Документация Unicode HOWTO для Python 2.7.18
  3. Документация Unicode HOWTO для Python 3.12.2
  4. 2to3 — Автоматический перевод кода с Python 2 на Python 3
  5. Строки и символьные данные в Python – Real Python
  6. Часто задаваемые вопросы о UTF-8 и Unicode