Почему вместо русского языка кракозябры?

303
26 мая 2022, 13:30

Только учусь делать сайт с помощью python. И решил сделать страницу с русским языком, но вышли кракозябры:

Понимаю что проблема с кодировкой(скорее всего), вот только не пойму где и как исправить...

Код:

#!/Python380/python 
print("Content-type: text / html")
print(
"""
<html lang="ru">
    <head>
        <meta charset="utf-8">
        <title>Проба с Python</title>
    </head>
    <body>
        <h1><b>Привет</b></h1>
    </body>
</html>
"""
)

Кодировка файла python:

Answer 1

Как выяснилось в комментариях, автор вопроса использует Windows 10 для запуска кода. Так как канал stdout у Windows работает на кодировке cp866 (cp1251 - если была перенастроена кодовая страница), передавая текст страницы через print, вы приводите его к системной кодировке. Именно из-за несоответствия содержимого тега meta и кодировки, в которой код страницы попадает на сервер, вы и получаете кракозябры.

Как один из вариантов решения данной проблемы, могу посоветовать записывать код страницы в какой-то файл на диске с указанием целевой кодировки. Делается это при открытии файла, например так:

raw_html = """
<html lang="ru">
    <head>
        <meta charset="utf-8">
        <title>Проба с Python</title>
    </head>
    <body>
        <h1><b>Привет</b></h1>
    </body>
</html>
"""
with open('path\to\file.html', mode='w', encoding='utf-8') as page_file:
    page_file.write(raw_html)
Answer 2

На Хабре дали такой ответ:

import sys
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

После него всё стало работать

READ ALSO
Регулярное выражение: поиск подстроки содержащее заданное слово с исключением при другом слове

Регулярное выражение: поиск подстроки содержащее заданное слово с исключением при другом слове

Нужно распарсить html-документ и найти все начальные теги <div>, которые содержат определенное слово, но при этом исключить строки содержащие...

204