Проблемы с кодировкой UTF-8 в HTML файле

Valeri J

Новичок
Пользователь
Сен 30, 2021
5
0
1
Windows 10
Python 3.9.7
Локальный хостинг - Apache 2.4
Есть HTML страница, написанная на Python:
Python:
#! C:/Python/python

print ('Content-type: text/html\n\n')
print ('''<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Титул</title>
</head>

<body>Текст</body>
</html>''')
Чтобы я с ней не делал (пробовал все, что нашел в сети про кодировки в Python), вместо русского текста выводятся знаки �����
При этом, если загружать в данную страницу русский текст из файла, то он читается нормально.

Помогите, пожалуйста, решить проблему!
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Можно указать кодировку в конфиге апача (apache2.conf):
Код:
AddDefaultCharset UTF-8   
SetEnv PYTHONIOENCODING utf8
 
  • Мне нравится
Реакции: Valeri J

Valeri J

Новичок
Пользователь
Сен 30, 2021
5
0
1
stud_55 - делал.
В этом случае текст в файле Python становится нормальным.
Но создается другая проблема - если в этот файл Python загрузить русский текст из текстового файла:

Python:
fa = open('news.txt')
ws = fa.read()
fa.close()
print (ws)

то тест из файла news.tx превращается в кракозябру:
Если удалить предложенные вами строки из конфига Апача, то текст из файла news.tx становится нормальным, а текст, встроенный в файл Python превращается в �����
Получается: все время один какой-то текст нормальный, а второй выводится в непонятном виде. Или или. Чтобы все тексты отображались правильно - не выходит.

При этом и текстовый файл и файл Python написаны и сохранены в utf-8.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Но создается другая проблема - если в этот файл Python загрузить русский текст из текстового файла то тест из файла news.tx превращается в кракозябру
Попробовал загрузить текст из файла - у меня он отобразился нормально.
Попробуйте указать кодировку при открытии файла (хотя у меня этого не потребовалось):
Python:
with open('news.txt', 'r', encoding='utf-8') as f:
    ws = f.read()
    print(ws)
 
  • Мне нравится
Реакции: Valeri J

Valeri J

Новичок
Пользователь
Сен 30, 2021
5
0
1
stud_55 - я наверное неудачно описал ситуацию.
Текст из внешнего текстового файла у меня загружается и выводится правильно. А вот текст, прописанный в самом файле Python, выводится в виде ромбов.
Ниже полный код программы с комментариями, где и что получается.

Файл и внешний текстовый файл написаны и сохранены в utf-8
Полный код:
Python:
#! C:/Python/python

print ('Content-type: text/html\n\n')

# Титул и слово Текст в теле документа выводятся ромбами
print ('''<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Титул</title>
</head>

<body>Текст<br>''')

fa = open('set/news.txt')
ws = fa.read()
fa.close()

# Текст из файла set/news.txt выводится в правильном виде
print (ws)

print ('</body></html>')

Изменить ситуацию можно только записав в Апаче строку SetEnv PYTHONIOENCODING utf8
Тогда текст, встроенный в файл Python отображается правильно. Но теперь неправильно отображается текст из файла set/news.txt
Никаких вариантов, чтобы и текст, встроенный в файл Python, и текст из файла set/news.txt отображались одинаково правильно мне найти не удалось.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Текст из внешнего текстового файла у меня загружается и выводится правильно. А вот текст, прописанный в самом файле Python, выводится в виде ромбов.
Это я понял. Проверил на апаче получил ромбы вместо текста, поменял настройки в апаче - текст стал нормальным и текст из файла тоже.
Изменить ситуацию можно только записав в Апаче строку SetEnv PYTHONIOENCODING utf8
Возможно вы добавили только эту строку. Попробуйте добавить обе:
Python:
AddDefaultCharset UTF-8   
SetEnv PYTHONIOENCODING utf8
Также после изменения конфига нужно перезагрузить апач.
 
  • Мне нравится
Реакции: Valeri J

Valeri J

Новичок
Пользователь
Сен 30, 2021
5
0
1
stud_55 - вроде бы я уже делал все, что вы рекомендовали, но скорее, где-то допускал ошибки.
Вставил ваш код:
Python:
with open('news.txt', 'r', encoding='utf-8') as f:
    ws = f.read()
    print(ws)
и все заработало.
Большое спасибо!
 

Valeri J

Новичок
Пользователь
Сен 30, 2021
5
0
1
Разобрался, в чем состояло правильное решение. В комбинации:
строк в конфиге Апача
Код:
AddDefaultCharset UTF-8  
SetEnv PYTHONIOENCODING utf8
и кодирования в файле Python
Python:
encoding='utf-8'
 

Форум IT Специалистов