Экранирование символов Юникода в ASCII и преобразование их обратно в Юникод без потерь

Я делаю проект Python, в котором мне нужно закодировать строку в ASCII, чтобы использовать ее, а затем вернуть ее и преобразовать обратно в Unicode. Проблема в том, что строка может содержать такие символы, как диакритические знаки, которых нет в кодировке ASCII. Я хотел бы избежать их в той или иной форме в своей строке, а затем вернуть их без потерь.

Я безуспешно пытался возиться с .encode и .decode и просмотрел некоторые ответы на этом сайте, но ни один из них не помог ни в кодировании, ни в декодировании. Я видел функцию ascii в Python, но у нее нет противоположности.

Примечание. Использование JSON, как предложено в повторяющихся заметках, — это не то, что я могу сделать в этом случае. Мне нужно было иметь чистый ASCII, который можно было бы преобразовать обратно позже.

2-е примечание: использование байтового формата, также предложенного в повторяющихся примечаниях, также не будет работать. Мне нужна СТРОКА в ASCII.

Просто используйте существующий формат, который уже решил эту проблему. JSON, например, имеет встроенные механизмы escape и анализаторы практически на всех платформах. Хотя большая часть JSON использует UTF-8, достаточно просто экранировать все, что не является ASCII (и фактически некоторые реализации делают это по умолчанию).

Joachim Sauer 25.04.2024 14:49

Это зависит от того, как вы используете encode. Я бы использовал его с «unicode_escape» в качестве кодировки (так что ASCII + \uxxxx и \Uxxxxxxxx

Giacomo Catenazzi 25.04.2024 15:06

@JoachimSauer, не вдаваясь в подробности, использование JSON не поможет. Мне нужна была эта строка в чистом ASCII.

omerien 25.04.2024 15:14

Существует множество различных схем кодирования строк для различных контекстов, многие из которых кодируют чистый ASCII. Какой из них соответствует вашим потребностям, мы понятия не имеем…

deceze 25.04.2024 15:19

JSON можно легко представить с использованием «чистого ASCII», поэтому я не понимаю, в чем заключается ваше ограничение. Кажется, у вас есть некоторые дополнительные ограничения помимо «чистого ASCII», которые вы не указываете явно.

Joachim Sauer 25.04.2024 15:36
encode и decode работают хорошо, просто нужно правильно подобрать последовательности: Возможные комбинации: 1. Кодирование с использованием кодека unicode-escape для экранирования и строки туда и обратно 2. Используйте кодек ASCII и используйте xmlcharrefreplace для обработки ошибок и используйте html.unescape() для строки туда и обратно 3 . Используйте кодек ASCII и используйте backslashreplace или namereplace для обработки ошибок, а также используйте кодек unicode-escape' для двусторонней строки.
Andj 26.04.2024 06:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для этой цели я бы использовал urllib.parse.quote и urllib.parse.unquote, простой пример:

import urllib.parse
text_with_accent = "El Niño"
ascii_text = urllib.parse.quote(text_with_accent)
print(ascii_text)  # El%20Ni%C3%B1o
print(ascii_text.isascii())  # True
original_text = urllib.parse.unquote(ascii_text)
print(text_with_accent==original_text)  # True

urllib.parse является частью стандартной библиотеки, поэтому вам не нужно ничего устанавливать, кроме самого python.

Другие вопросы по теме