Ascii: примеры (PYTHON)

Использование функции ascii для работы с символами в Python
Раздел: Встроенные функции, Строки
ascii(object): str

Функция ascii() в Python

Функция ascii() возвращает строковое представление объекта, содержащее только символы ASCII, при этом не-ASCII символы заменяются на экранированные последовательности. Она является встроенной функцией Python, не требует импорта модулей.

Когда используется: Основное применение - для отладки, логирования и сериализации данных, когда необходимо гарантировать, что вывод содержит только печатные символы ASCII. Это полезно при работе с системами, которые не поддерживают Unicode, или для безопасного отображения данных с неопределенными символами.

Аргументы: Функция принимает один обязательный аргумент:

  • object - любой объект Python (строка, список, кортеж, словарь, пользовательский объект и т.д.).

Возвращаемое значение: Строка (str), содержащая представление переданного объекта. Для строк: не-ASCII символы (например, кириллица, эмодзи) заменяются на escape-последовательности вида \x, \u или \U. Для других объектов функция вызывает их метод __repr__() и аналогично экранирует не-ASCII символы в полученной строке.

Функция не изменяет исходный объект и не влияет на его кодировку.

Примеры использования ascii()

Пример 1: Работа со строками, содержащими не-ASCII символы

print(ascii('Привет, мир!'))
'\u041f\u0440\u0438\u0432\u0435\u0442, \u043c\u0438\u0440!'

Пример 2: Строка с эмодзи и специальными символами

print(ascii('Hello ????!'))
'Hello \U0001f30d!'

Пример 3: Использование с объектами, отличными от строк

print(ascii(['Яблоко', 'Апельсин']))
['\u042f\u0431\u043b\u043e\u043a\u043e', '\u0410\u043f\u0435\u043b\u044c\u0441\u0438\u043d']

Пример 4: Словарь с не-ASCII ключами

print(ascii({'ключ': 'значение'}))
{'\u043a\u043b\u044e\u0447': '\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'}

Похожие функции в Python

repr() - возвращает строковое представление объекта, пригодное для передачи интерпретатору. В отличие от ascii(), repr() может содержать не-ASCII символы без экранирования, если это позволяет кодировка системы. ascii() эквивалентна repr() с последующим экранированием не-ASCII символов.

str() - возвращает «неформальное» строковое представление объекта, ориентированное на читаемость. Не выполняет экранирование символов.

Выбор функции: ascii() применяется, когда требуется гарантировать ASCII-совместимость вывода. repr() используется для отладочного вывода, который может быть прочитан интерпретатором. str() подходит для пользовательского вывода.

Аналоги функции в других языках

PHP: Функция var_export() с флагом true возвращает строковое представление переменной, но не экранирует не-ASCII символы. Для экранирования можно использовать json_encode() с флагами или addcslashes().

echo json_encode('Привет', JSON_UNESCAPED_UNICODE);
"Привет"

JavaScript: Нет прямой аналогии. Метод JSON.stringify() экранирует не-ASCII символы в Unicode escape-последовательностях.

console.log(JSON.stringify('Привет'));
"\u041f\u0440\u0438\u0432\u0435\u0442"

Java: Метод StringEscapeUtils.escapeJava() из библиотеки Apache Commons Text выполняет экранирование, включая Unicode.

String str = "Привет";
System.out.println(StringEscapeUtils.escapeJava(str));
\u041f\u0440\u0438\u0432\u0435\u0442

C#: Метод Regex.Escape() экранирует спецсимволы, но не все не-ASCII символы. Для полного экранирования можно использовать возможности сериализации.

string input = "Привет";
string escaped = Regex.Escape(input);
Console.WriteLine(escaped);
\u041f\u0440\u0438\u0432\u0435\u0442

Lua: Нет встроенной функции. Обычно используют пользовательские реализации для экранирования.

Golang: Пакет strconv предоставляет функцию Quote(), которая возвращает строку в двойных кавычках с экранированием не-ASCII символов.

s := "Привет"
fmt.Println(strconv.Quote(s))
"\u041f\u0440\u0438\u0432\u0435\u0442"

Kotlin: Функция String.toCharArray() и последующая обработка или использование JSON.encodeToString() из библиотеки сериализации.

val str = "Привет"
println(JSON.encodeToString(str))
"\u041f\u0440\u0438\u0432\u0435\u0442"

Типичные ошибки

1. Ожидание изменения исходного объекта: Функция возвращает новую строку, не изменяя исходный объект.

text = 'Hello'
result = ascii(text)
print(text)  # Оригинал не изменился
Hello

2. Неверное использование с бинарными данными: Передача байтовой строки (bytes) приведет к выводу с экранированием, но это может быть неожиданным.

print(ascii(b'\xff'))
b'\xff'

3. Попытка экранирования уже экранированной строки: Может привести к удвоению escape-последовательностей.

s = '\u041f'
print(ascii(s))
'\\u041f'

4. Использование для кодирования: Функция не выполняет кодирование в ASCII, только экранирование. Для кодирования используйте str.encode('ascii', 'ignore').

Изменения в последних версиях Python

Функция ascii() была добавлена в Python 3.0 как часть перехода к Unicode по умолчанию. В более поздних версиях Python 3 (3.x) значительных изменений в работе функции не было. Поведение функции стабильно и не зависит от версии в пределах ветки Python 3.

Важное изменение, связанное с экранированием, произошло в Python 3.3: улучшена поддержка суррогатных пар Unicode в escape-последовательностях, что может влиять на отображение некоторых специальных символов.

Расширенные примеры использования

Пример 1: Экранирование многострочной строки

Пример python
multiline = '''Первая строка
Вторая строка с символом ©'''
print(ascii(multiline))
'Первая строка\nВторая строка с символом \xa9'

Пример 2: Обработка пользовательского класса

Пример python
class MyClass:
    def __repr__(self):
        return 'Объект с символом €'

obj = MyClass()
print(ascii(obj))
'\u041e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u043c \u20ac'

Пример 3: Сравнение вывода ascii() и repr() для одного объекта

Пример python
text = 'Café'
print('repr:', repr(text))
print('ascii:', ascii(text))
repr: 'Café'
ascii: 'Caf\xe9'

Пример 4: Использование в логах для безопасного вывода

Пример python
import logging
user_input = 'Некорректный ввод: "test"'
logging.warning(ascii(user_input))
WARNING:root:'\u041d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0432\u0432\u043e\u0434: "test"'

Пример 5: Фильтрация не-ASCII символов через генератор списка

Пример python
text = 'Hello 世界'
filtered = ''.join(ch if ord(ch) < 128 else ascii(ch)[1:-1] for ch in text)
print(filtered)
Hello \u4e16\u754c

питон ascii function comments

En
Ascii Return ASCII representation