Как правильно задать кодировку utf-8 в python при генерации файла?
Вот исходный код файла-генератора на python. Не могу настроить правильную кодировку при записи в файл, записывает кракозябру
from outfile import outfile_text from datetime import datetime as dt def generate_page(head, body): page = "<html lang='ru'>" + head + body + "</html>" return page def generate_head(title): head = "<meta charset='utf-8'>"+"<title>" + title + "</title>" return "<head>" + head + "</head>" def generate_body(header, paragraphs): body = "<h2>" + header + "</h2>" for p in paragraphs: body += "<p>" + p + "</p>" return "<body>" + body + "</body>" def save_page(title, header, paragraphs, output="index.html"): fp = open(output, "w") today = dt.now().date() page = generate_page( head = generate_head(title), body = generate_body( header=header, paragraphs=paragraphs ) ) print(page, file=fp) fp.close() today = dt.now().date() save_page( title = "Заголовок1", header = "Сегодня " + str(today), paragraphs = generate_texts(), )
Пробовал написанное уже здесь решение Вывод UTF-8 CGI-скриптом на Python 3, не помогает. Также там пишут, что надо настроить apache. Его можно настроить в openserver или для питона есть свой апач? Версия python 3.7
Итоговый файл
<html lang='ru'> <head> <meta charset='utf-8'> <title>×òî-òî ïðî ãîðîñêîïû</title> </head> <body> <h2>×òî äåíü 2019-10-30ãîòîâèò</h2> <p>Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.</p> <p>Óòðîì áóäüòå îòêðûòû äëÿ ãîñòåé èç çàáûòîãî ïðîøëîãî. Âå÷åðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Âå÷åðîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà.</p> <p>Ïîñëå Îáåäà îæèäàéòå ãîñòåé èç çàáûòîãî ïðîøëîãî. Äí¸ì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî. Ïåðåä Ñíîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè.</p> <p>Ïåðåä Ñíîì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Óòðîì îæèäàéòå âñòðå÷ ñî ñòàðûìè çíàêîìûìè. Óòðîì ïðåäîñòåðåãàéòåñü ãîñòåé èç çàáûòîãî ïðîøëîãî.</p> <p>Äí¸ì îæèäàéòå íåîæèäàííîãî ïðàçäíèêà. Ïîñëå Îáåäà áóäüòå îòêðûòû äëÿ ïðèÿòíûõ ïåðåìåí. Óòðîì áóäüòå îòêðûòû äëÿ íåîæèäàííîãî ïðàçäíèêà.</p> </body> </html>
- python
- python-3.x
- python-3.7
1
В сети есть достаточное количество онлайн сервисов, которые позволяют расшифровать кракозябры в текст и попутно определить кодировки. Это поможет определить, что не так с кодировками. Например, расшифровка текста одного из абзацев позволяет определить, что в кракозябрах отображен исходных текст в кодировки CP1251, зашифрованные кодировкой CP1252. Во избежание подобного, нужно указывать кодировку при открытии файла.
Конкретно в вашем случае, нужно изменить функцию save_page
следующим образом:
def save_page(title, header, paragraphs, output='index. html'): with open(output, mode='w', encoding='utf-8') as fp: today = dt.now().date() page = generate_page( head=generate_head(title), body=generate_body( header=header, paragraphs=paragraphs ) ) print(page, file=fp)
2
Зарегистрируйтесь или войдите
Регистрация через GoogleРегистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
Краткий курс HTML 5.
HTML-документ — Exlab<!DOCTYPE html> <html> <head> <title>Заголовок документа</title> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> </head> <body> Мой первый HTML-документ </body> </html>
Сохраните это в файл с расширением .html, после чего откройте его в браузере. Вы должны увидеть страницу с единственной надписью «Мой первый HTML-документ», да еще в заголовке браузера написано «Заголовок документа». Если вместо русских букв отображаются квадраты, то сохраните файл, выбрав в вашем редакторе кодировку UTF-8 (команда «Сохранить как…»).
Но давайте по порядку…Определение типа документа
Первая строчка сообщает браузеру, что наш документ составлен в формате HTML 5. Это так называемое DTD, и оно всегда расположено в самом начале. В других версиях HTML/XHTML эта строчка имеет более сложный вид и здесь рассматриваться не будет. Не забывайте указывать DTD, чтобы браузер знал, с чем имеет дело, и верно отображал документ.
Структура документа
Ниже находится корневой элемент <html>
, охватывающий весь документ от DTD до самого конца. Внутри него один за другим расположены <head>
и <body>
. Как и следует из названия, <head>
— это «голова» документа, в которой размещается заголовок <title>
(его содержимое отображается в заголовке браузера) и прочая служебная информация (сейчас это единственный элемент
). <body>
— это «тело» документа, в котором и находится основной текст.
Элементы <html>
, <head>
и <title>
, наряду с DTD являются обязательными и должны быть размещены в описанном выше порядке. В противном случае документ не будет соответствовать стандартам W3C (проверьте одним из способов, описанных во введении). Это еще не значит, что он не будет отображаться в каких-либо браузерах, но нет гарантий, что отображение будет верным.
Кодировка документа
Элемент <meta />
предназначен для передачи служебной информации браузеру. Атрибут http-equiv
определяет «о чем сообщить», а content
— «что сообщить».
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
В этой строчке браузеру сообщается, что содержимое документа (content-type
) соответствует MIME-типу text/html
в кодировке UTF-8. Более подробно возможности этого элемента будут рассмотрены позже. Тег <meta />
непарный, поэтому завершается косой чертой «/».
Если нет причин использовать другую кодировку, то сохраняйте HTML-документы в UTF-8 (в большинстве редакторов есть соответствующая опция). К ее недостаткам можно отнести, пожалуй, лишь больший размер файлов. Это связано с тем, что символы, не входящие в
Объявление кодировок символов в HTML
Объявление кодировок символов в HTMLВопрос
Как мне объявить кодировку моего файла HTML?
Всегда следует указывать кодировку, используемую для страницы HTML или XML. Если вы этого не сделаете, вы рискуете неправильно интерпретировать символы в вашем контенте. Это не просто проблема удобочитаемости для человека, все чаще машинам также необходимо понимать ваши данные. Объявление кодировки символов также необходимо для обработки символов, отличных от ASCII, вводимых пользователем в формах, в URL-адресах, сгенерированных сценариями, и т. д. В этой статье описывается, как это сделать для HTML-файла.
Если вам нужно лучше понять, что такое символы и кодировки символов, см. статью Кодировки символов для начинающих . Сведения об объявлении кодировок для таблиц стилей CSS см. в разделе Объявления кодировок символов CSS .
Быстрый ответ
Всегда объявляйте кодировку вашего документа с помощью элемента meta
с атрибутом charset
или с использованием атрибутов http-equiv
и content
(называемых директивой pragma). Объявление должно полностью умещаться в первые 1024 байта в начале файла, поэтому лучше ставить его сразу после открытия
бирка.
<голова> <мета-кодировка="utf-8"> ...
<голова> ...
Неважно, какой вы используете, но проще набрать первый. Также не имеет значения, вводите ли вы UTF-8
или utf-8
.
Всегда следует использовать кодировку символов UTF-8. (Помните, что это означает, что вам также нужно сохраните ваш контент как UTF-8.) Посмотрите, что вы должны учитывать, если вы действительно не можете использовать UTF-8.
Если у вас есть доступ к настройкам сервера, вам также следует подумать, имеет ли смысл использовать HTTP-заголовок. Обратите внимание, однако , что, поскольку заголовок HTTP имеет более высокий приоритет, чем объявления meta
в документе, авторы контента всегда должны учитывать, объявлена ли уже кодировка символов в заголовке HTTP. Если да, то 9Элемент 0017 meta должен быть установлен для объявления той же кодировки.
Вы можете обнаружить любые кодировки, отправленные заголовком HTTP, с помощью средства проверки интернационализации.
Детали
Как насчет метки порядка байтов?
Если в начале файла у вас есть метка порядка байтов (BOM) UTF-8, то последние версии браузера, отличные от Internet Explorer 10 или 11, будут использовать ее для определения того, что кодировка вашей страницы — UTF-8. Он имеет более высокий приоритет, чем любое другое объявление, включая заголовок HTTP.
Вы можете пропустить декларацию кодировки meta
, если у вас есть спецификация, но мы рекомендуем вам сохранить ее, так как она помогает людям, просматривающим исходный код, установить кодировку страницы.
Подробнее о метке порядка байтов.
Должен ли я объявлять кодировку в заголовке HTTP?
Используйте объявления кодировки символов в заголовках HTTP, если это имеет смысл, и если вы можете, для любого типа контента, , но в сочетании с декларация в документе.
Авторы содержимого всегда должны обеспечивать соответствие объявлений HTTP объявлениям в документе.
Плюсы и минусы использования заголовка HTTP
Одним из преимуществ использования HTTP-заголовка является то, что пользовательские агенты могут быстрее найти информацию о кодировке символов, когда она отправляется в HTTP-заголовке.
Информация заголовка HTTP имеет наивысший приоритет, если она конфликтует с объявлениями в документе, отличными от метки порядка байтов. Средний серверы, которые перекодируют данные (т. е. преобразуют в другую кодировку), могут воспользоваться этим, чтобы изменить кодировку документа перед его отправкой на небольшие устройства, которые распознают только несколько кодировки. Неясно, широко ли это перекодирование используется в настоящее время. Если это так, и он преобразует содержимое в кодировку, отличную от UTF-8, существует высокий риск потери данных, и поэтому это не рекомендуется.
С другой стороны, есть ряд потенциальных недостатков:
Авторам контента может быть сложно изменить информацию о кодировании статических файлов на сервере, особенно при работе с интернет-провайдером. Авторам потребуются знания и доступ к настройкам сервера.
Настройки сервера могут не синхронизироваться с документом по той или иной причине. Это может произойти, например, если вы полагаться на сервер по умолчанию, и это значение по умолчанию изменено. Это очень плохая ситуация, поскольку более высокий приоритет информации HTTP по сравнению с объявление в документе может привести к тому, что документ станет нечитаемым.
Возможны проблемы как со статическими, так и с динамическими документами, если они не читаются с сервера; например, если они сохранены в место, например компакт-диск или жесткий диск. В этих случаях любая информация о кодировании из заголовка HTTP недоступна.
Аналогичным образом, если кодировка символов объявлена только в заголовке HTTP, эта информация больше недоступна для файлов во время редактирования или когда они обрабатываются такими вещами, как XSLT или скрипты, или при отправке на перевод и т. д.
Должен ли я использовать этот метод?
При обслуживании файлов через HTTP с сервера никогда не возникает проблем с отправкой информации о кодировке символов документа в заголовке HTTP, если эта информация верна.
С другой стороны, из-за перечисленных выше недостатков мы рекомендуем всегда объявлять информацию о кодировке внутри документа. Объявление в документе также помогает разработчикам, тестировщикам или менеджерам по переводу, которые хотят визуально проверить кодировку документа.
(Некоторые люди утверждают, что редко уместно объявлять кодировку в заголовке HTTP, если вы собираетесь повторить ее в содержание документа. В этом случае они предлагают, чтобы заголовок HTTP ничего не говорил о кодировке документа. Обратите внимание, что это обычно означает принятие мер по отключению любых настроек сервера по умолчанию.)
Работа с форматами полиглот и XML
XHTML5: Документ XHTML5 обслуживается как XML и имеет синтаксис XML. Парсеры XML не распознают объявления кодировки в мета
элементов. Они распознают только объявление XML. Вот пример:
Объявление XML требуется только в том случае, если страница не обслуживается как UTF-8 (или UTF-16), но может быть полезно включить его, чтобы разработчики, тестировщики или менеджеры по переводу могли визуально проверять кодировку документ, глядя на источник.
Разметка полиглота: Страница, использующая разметку полиглота, использует подмножество HTML с синтаксисом XML, который может анализироваться синтаксическим анализатором HTML или XML. Он описан в Polyglot Markup: надежный профиль словаря HTML5 .
Поскольку полиглот-документ должен быть в кодировке UTF-8, вам не нужно и не следует использовать объявление XML. С другой стороны, если файл должен быть прочитан как HTML, вам нужно будет объявить кодировку, используя мета-элемент
, метку порядка байтов или заголовок HTTP.
Поскольку объявление в мета-элементе
будет распознаваться только парсером HTML, если вы используете подход с атрибутом content
, его значение должно начинаться с text/html;
.
Если вы используете мета-элемент
с атрибутом charset
, это не то, что вам нужно учитывать.
Дополнительная информация
Информация в этом разделе относится к вещам, которые вам обычно не нужно знать, но которые включены сюда для полноты картины.
Работа с кодировками, отличными от UTF-8
Использование UTF-8 не только упрощает разработку страниц, но и позволяет избежать неожиданных результатов при отправке форм и кодировке URL-адресов, которые по умолчанию используют кодировку символов документа. Если вы действительно не можете избежать использования кодировки символов, отличной от UTF-8, вам придется выбирать из ограниченного набора имен кодировок, чтобы обеспечить максимальную совместимость и максимально длительный срок удобочитаемости вашего контента.
Хотя обычно они называются charset именами, на самом деле они относятся к кодировкам, а не к наборам символов. Например, набор символов Unicode или «репертуар» может быть закодирован тремя различными схемами кодирования.
До недавнего времени реестр IANA был местом, где можно было найти имена для кодировок. Реестр IANA обычно включает несколько имен для одной и той же кодировки. В этом случае вы должны использовать имя, обозначенное как «предпочтительный».
Новая спецификация Encoding теперь содержит список, протестированный на реальных реализациях браузеров. Список можно найти в таблице в разделе Кодировки. Лучше всего использовать имена из левого столбца этой таблицы.
Обратите внимание, , однако, что наличие имени в любом из этих источников не обязательно означает, что можно использовать эту кодировку. Некоторые из кодировок проблематичны. Если вы действительно не можете использовать UTF-8, вам следует внимательно изучить советы в статье 9.0009 Выбор и применение кодировки символов .
Не придумывайте собственные имена кодировок, которым предшествует x-
. Это плохая идея, так как
ограничивает интероперабельность.
Работа с устаревшими форматами HTML
HTML 4.01 не определяет использование атрибута charset
с элементом meta
, но любой современный браузер все равно обнаружит и использует его, даже если страница объявлена как HTML4, а не HTML5. Этот раздел актуален только в том случае, если у вас есть какая-либо другая причина, кроме обслуживания браузера для соответствия старому формату HTML. В нем описываются любые отличия от раздела «Подробности» выше.
Для страниц, обслуживаемых как XML, см. Работа с форматами полиглота и XML.
HTML4: Как упоминалось выше, для полного соответствия HTML 4.01 необходимо использовать директиву pragma, а не атрибут charset
.
XHTML 1.x используется как text/html: Также требуется директива pragma для полного соответствия HTML 4.01, а не атрибут charset
. Вам не нужно использовать объявление XML, так как файл обслуживается как HTML.
XHTML 1.x используется как XML: Используйте кодировку
объявления объявления XML в первой строке страницы. Убедитесь, что перед ним ничего нет, включая пробелы (хотя метка порядка байтов допустима).
Атрибут
charset
в ссылке HTML5 не рекомендует использование атрибута charset
в элементе a
или link
, поэтому вам следует избегать его использования. Он возник в спецификации HTML 4.01 для использования с a
, link
и script
элементы и должны были указывать кодировку документа, на который вы ссылаетесь.
Он был предназначен для использования во встроенном элементе ссылки, подобном этому:
Неверный код. Не копируйте!
См. наш список публикаций.
Идея заключалась в том, чтобы браузер мог применить правильную кодировку к документу, который он извлекает, если кодировка не указана для документа каким-либо другим способом.
Всегда возникали проблемы с использованием этого атрибута. Во-первых, он плохо поддерживается основными браузерами. Одна из причин не поддерживать этот атрибут заключается в том, что если браузеры будут делать это без специальных дополнительных правил, это будет вектором атаки XSS. Во-вторых, трудно гарантировать, что информация верна в любой момент времени. Автор указанного документа вполне может изменить кодировку документа без вашего ведома. Если автор до сих пор не указал кодировку своего документа, теперь вы будете просить браузер применить неправильную кодировку. И в-третьих, в этом не должно быть необходимости, если люди будут следовать рекомендациям, изложенным в этой статье, и правильно размечать свои документы. Это гораздо лучший подход.
Этот способ указания кодировки документа имеет самый низкий приоритет (т. е. если кодировка объявлена каким-либо другим способом, это будет проигнорировано). Это означает, что вы также не можете использовать это для исправления неправильных объявлений.
Работа с кодировкой UTF-16
Согласно результатам выборки Google из нескольких миллиардов страниц, менее 0,01% страниц в Интернете имеют кодировку UTF-16. UTF-8 составляет более 80% всех веб-страниц, если вы включаете его подмножество, ASCII, и более 60%, если вы этого не делаете. Вам настоятельно не рекомендуется использовать UTF-16 в качестве кодировки страницы.
Если по какой-то причине у вас нет выбора, вот несколько правил объявления кодировки. Они отличаются от таковых для других кодировок.
Спецификация HTML5 запрещает использование элемента meta
для объявления UTF-16, поскольку значения должны быть ASCII-совместимыми. Вместо этого вы должны убедиться, что у вас всегда есть метка порядка байтов в самом начале файла в кодировке UTF-16. По сути, это декларация в документе.
Кроме того, если ваша страница закодирована как UTF-16, не объявляйте свой файл как «UTF-16BE» или «UTF-16LE», используйте только «UTF-16». Метка порядка байтов в начале вашего файла будет указывать, является ли схема кодирования прямым порядком байтов или обратным порядком байтов. (Это связано с тем, что контент, явно закодированный, скажем, как UTF-16BE, не должен использовать метку порядка байтов, но HTML5 требует метки порядка байтов для страниц, закодированных UTF-16. )
Дальнейшее чтение
Начать? Знакомство с наборами символов и кодировками
Tutorial, Работа с кодировками символов в HTML и CSS
Ссылки по теме, Создание HTML и CSS
- Символы
- Объявление кодировки символов для HTML
- Выбор и применение кодировки символов
Ссылки по теме, Настройка сервера
- Символы
Как установить кодировку символов для документа в HTML5?
Улучшить статью
Сохранить статью
- Последнее обновление: 01 апр, 2021
Улучшить статью
Сохранить статью
Кодировка символов — это метод определения соответствия между байтами и текстом. Чтобы правильно отображать HTML-документ, мы должны выбрать правильную кодировку символов.
Различные типы кодировки символов включают:
- Набор символов ASCII: Это первый стандарт кодировки символов. Основным недостатком ASCII является то, что он содержит только ограниченный диапазон символов (128 символов).
- Набор символов ANSI: Этот стандарт был расширенной версией стандартного набора символов ASCII. Он поддерживает 256 символов.
- Набор символов ISO-8859-1: Это кодировка символов по умолчанию в HTML 2.0. Это также расширение стандарта ASCII с международными символами. Это использовало полные байты (8 бит) для отображения символов.
- Набор символов UTF-8: Этот стандарт охватывает почти все символы и символы в мире. Ограничения ANSI и ISO-8859-1 удовлетворялись набором символов UTF-8. Кодировка символов по умолчанию для HTML5 — UTF-8.
Спецификация HTML5 рекомендует разработчикам использовать набор символов UTF-8.
Символ может иметь длину от 1 до 4 байтов в стандарте кодирования UTF-8. Это также наиболее предпочтительная кодировка для электронной почты и веб-страниц.
- Кодировку символов можно указать в метатеге HTML.
- Метатег используется для указания метаданных о веб-странице и не будет отображаться на веб-страницах.
- Метатег помогает поисковым системам понять, о чем веб-страница.
- Метатег должен быть размещен вместе с тегом head в HTML.
Синтаксис:
1. Для HTML4
2. Для HTML5
Кодировкой символов по умолчанию для HTML5 является UTF-8, но вы все равно можете указать ее, чтобы быть особенно осторожным.
Example:
HTML
|