Я делаю проект Python, в котором мне нужно закодировать строку в ASCII, чтобы использовать ее, а затем вернуть ее и преобразовать обратно в Unicode. Проблема в том, что строка может содержать такие символы, как диакритические знаки, которых нет в кодировке ASCII. Я хотел бы избежать их в той или иной форме в своей строке, а затем вернуть их без потерь.
Я безуспешно пытался возиться с .encode и .decode и просмотрел некоторые ответы на этом сайте, но ни один из них не помог ни в кодировании, ни в декодировании. Я видел функцию ascii в Python, но у нее нет противоположности.
Примечание. Использование JSON, как предложено в повторяющихся заметках, — это не то, что я могу сделать в этом случае. Мне нужно было иметь чистый ASCII, который можно было бы преобразовать обратно позже.
2-е примечание: использование байтового формата, также предложенного в повторяющихся примечаниях, также не будет работать. Мне нужна СТРОКА в ASCII.
Это зависит от того, как вы используете encode
. Я бы использовал его с «unicode_escape» в качестве кодировки (так что ASCII + \uxxxx и \Uxxxxxxxx
@JoachimSauer, не вдаваясь в подробности, использование JSON не поможет. Мне нужна была эта строка в чистом ASCII.
Существует множество различных схем кодирования строк для различных контекстов, многие из которых кодируют чистый ASCII. Какой из них соответствует вашим потребностям, мы понятия не имеем…
JSON можно легко представить с использованием «чистого ASCII», поэтому я не понимаю, в чем заключается ваше ограничение. Кажется, у вас есть некоторые дополнительные ограничения помимо «чистого ASCII», которые вы не указываете явно.
encode
и decode
работают хорошо, просто нужно правильно подобрать последовательности: Возможные комбинации: 1. Кодирование с использованием кодека unicode-escape
для экранирования и строки туда и обратно 2. Используйте кодек ASCII и используйте xmlcharrefreplace
для обработки ошибок и используйте html.unescape()
для строки туда и обратно 3 . Используйте кодек ASCII и используйте backslashreplace
или namereplace
для обработки ошибок, а также используйте кодек unicode-escape'
для двусторонней строки.
Для этой цели я бы использовал 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
.
Просто используйте существующий формат, который уже решил эту проблему. JSON, например, имеет встроенные механизмы escape и анализаторы практически на всех платформах. Хотя большая часть JSON использует UTF-8, достаточно просто экранировать все, что не является ASCII (и фактически некоторые реализации делают это по умолчанию).