Я вытаскиваю данные из документа Google, обрабатываю их и записываю в файл (который в итоге вставлю на страницу Wordpress).
У него есть не-ASCII символы. Как я могу безопасно преобразовать их в символы, которые можно использовать в исходном коде HTML?
В настоящее время я конвертирую все в Unicode по пути, объединяю все это в строку Python, затем делаю:
import codecs
f = codecs.open('out.txt', mode="w", encoding="iso-8859-1")
f.write(all_html.encode("iso-8859-1", "replace"))
В последней строке есть ошибка кодирования:
UnicodeDecodeError: кодек «ascii» не может декодировать байт 0xa0 в позиции 12286: порядковый номер не в диапазоне (128)
Частичное решение:
Этот Python работает без ошибок:
row = [unicode(x.strip()) if x is not None else u'' for x in row]
all_html = row[0] + "<br/>" + row[1]
f = open('out.txt', 'w')
f.write(all_html.encode("utf-8"))
Но затем, если я открою текстовый файл, я вижу много символов, таких как:
Qur’an
Может мне нужно написать что-то кроме текстового файла?
Ответы:
Работайте исключительно с объектами Unicode в максимально возможной степени, декодируя объекты в объекты Unicode, когда вы впервые получаете их, и кодируйте их по мере необходимости на выходе.
Если ваша строка на самом деле является объектом Юникода, вам необходимо преобразовать его в объект строки в кодировке Юникод перед записью в файл:
Когда вы снова прочитаете этот файл, вы получите строку в кодировке Unicode, которую вы можете декодировать в объект Unicode:
источник
В Python 2.6+ вы можете использовать
io.open()
это по умолчанию ( встроенныйopen()
) в Python 3:Это может быть более удобно, если вам нужно писать текст постепенно (вам не нужно звонить
unicode_text.encode(character_encoding)
несколько раз). В отличие отcodecs
модуля,io
модуль имеет правильную универсальную поддержку перевода строки.источник
Обработка строк Unicode уже стандартизирована в Python 3.
Вам нужно всего лишь открыть файл в utf-8
(преобразование 32-битного Unicode в utf-8 переменной длины байта автоматически выполняется из памяти в файл.)
источник
Открываемый файл
codecs.open
- это файл, который принимаетunicode
данные, кодирует ихiso-8859-1
и записывает в файл. Однако то, что вы пытаетесь написать, не такunicode
; Вы беретеunicode
и кодируете это вiso-8859-1
себе . Это то, чтоunicode.encode
делает метод, и результат кодирования строки Unicode - строка байтов (str
тип.)Вы должны либо использовать normal
open()
и кодировать юникод самостоятельно, либо (как правило, лучшая идея) использовать,codecs.open()
а не кодировать данные самостоятельно.источник
Предисловие: будет ли работать ваш зритель?
Убедитесь, что ваш просмотрщик / редактор / терминал (однако вы взаимодействуете с файлом в кодировке utf-8) может прочитать файл. Это часто проблема в Windows , например, Блокнот.
В Python 2 используйте
open
изio
модуля (это то же самое, что встроенныйopen
в Python 3):Как правило, рекомендуется использовать
UTF-8
для записи в файлы (нам даже не нужно беспокоиться о порядке следования байтов в utf-8).utf-8 - это самая современная и универсальная кодировка, которая работает во всех веб-браузерах, большинстве текстовых редакторов (смотрите ваши настройки, если у вас есть проблемы) и большинстве терминалов / оболочек.
В Windows вы можете попробовать,
utf-16le
если вы ограничены просмотром вывода в Блокноте (или другом ограниченном средстве просмотра).И просто откройте его с помощью менеджера контекста и запишите свои символы Юникода:
Пример использования множества символов Юникода
Вот пример, который пытается отобразить каждый возможный символ шириной до трех бит (4 - максимум, но это будет немного дальше) из цифрового представления (в целых числах) в закодированный вывод для печати вместе с его именем, если возможно (поместите это в файл с именем
uni.py
):Это должно выполняться примерно в течение минуты, и вы можете просмотреть файл данных, и если ваша программа просмотра файлов может отображать Unicode, вы увидите это. Информацию о категориях можно найти здесь . Основываясь на подсчете, мы, вероятно, можем улучшить наши результаты, исключив категории Cn и Co, которые не имеют связанных с ними символов.
Он будет отображать шестнадцатеричное отображение, категорию , символ (если не может получить имя, поэтому, вероятно, управляющий символ) и имя символа. например
Я рекомендую
less
для Unix или Cygwin (не выводить / cat весь файл на ваш вывод):Например, будет отображаться аналогично следующим строкам, которые я сэмплировал с помощью Python 2 (Unicode 5.2):
Мой Python 3.5 от Anaconda имеет Unicode 8.0, я бы предположил, что большинство 3-х было бы.
источник
Как напечатать символы Unicode в файл:
Сохраните это в файл: foo.py:
Запустите его и передайте вывод в файл:
Откройте tmp.txt и загляните внутрь, вы увидите это:
Таким образом, вы сохранили Unicode E с пометкой обфускации в файл.
источник
Эта ошибка возникает, когда вы пытаетесь закодировать не-юникодную строку: она пытается декодировать ее, предполагая, что она в простом ASCII. Есть две возможности:
f.write(all_html)
вместо..encode(...)
, он сначала пытается его расшифровать.источник
В случае написания на python3
В случае написания на python2:
Чтобы избежать этой ошибки, вы должны закодировать ее в байты, используя кодеки "utf-8", например так:
и декодировать данные при чтении с использованием кодеков "utf-8":
А также, если вы попытаетесь выполнить печать для этой строки, она будет автоматически декодирована с использованием кодеков "utf-8", подобных этой
источник