Почему rst2html5 портит кодировки?

У меня есть программа Python, написанная в UTF-8, что подтверждается PyCharm и Sublime Text. Он выводит символ фунта, £ (0xC2 0xA3), в повторно структурированный текст:

Почему rst2html5 портит кодировки?

Открытие файла reStructured Text с PyCharm и Sublime Text выглядит нормально, и оба заявляют, что это UTF-8.

Проблема возникает, когда я генерирую HTML из этого файла, используя rst2html5, с помощью этой команды:

 rst2html5 --input-encoding=utf-8 --output-encoding=utf-8 foo.rst > foo.html

HTML утверждает, что это UTF-8, посредством <meta charset = "utf-8" />, но символы решетки, £, теперь отображаются как ┬ú. Открытие его в Sublime Tex как UTF-8 также показывает ┬ú вместо £. Это актуальные данные:

Почему rst2html5 портит кодировки?

Есть идеи, что происходит или как это остановить? Это вообще похоже на UTF-8?

Сгенерированный файл начинается так:

Почему rst2html5 портит кодировки?

0xFF 0xFE напоминает мне Спецификация UTF-16, но установка заголовка на <meta charset = "utf-16" /> не решает проблему и требует, чтобы текстовый редактор открыл файл, поскольку UTF-16 по-прежнему показывает, что символ не ASCII нарушен.

Если это актуально, моя активная кодовая страница Windows - 437.

"Претендует на", а не? Или это на самом деле? Какие шестнадцатеричные байты используются для кодирования символа £? В UTF-8 это должно быть 0xC2 0xA3.

tripleee 28.11.2018 10:54

Вы просматриваете HTML-файл локально? Есть ли у него заголовок http-equiv, определяющий его кодировку? Если вы просматриваете его с веб-сервера, какие заголовки прикрепляет сервер?

tripleee 28.11.2018 10:55

@tripleee: Я добавил информацию о том, что я имею в виду под претензиями. Позвольте мне получить шестнадцатеричный редактор, и я получу фактические байты, но, разобравшись со многими проблемами кодирования, приведенными ниже, я вполне уверен, что это не проблема декодирования, а проблема кодирования.

pupeno 28.11.2018 11:14

@tripleee: я просматриваю файл локально, Chrome в Windows.

pupeno 28.11.2018 11:14

То, что вы видите, совершенно не имеет значения без информации о том, какие у вас шрифты и т. д. См. Также страница с информацией о теге Stack Overflow character-encoding

tripleee 28.11.2018 11:16

@tripleee: я понимаю, что шрифты будут влиять на необычные символы, но почти каждый шрифт и, конечно же, каждый шрифт по умолчанию имеет в себе символ фунта.

pupeno 28.11.2018 11:19

Вы явно не читали страницу, на которую я дал ссылку. И снова ссылка: ссылка на сайт

tripleee 28.11.2018 11:21

@tripleee: я прочитал страницу. Вы просили шестнадцатеричное представление, и я его получил. Я все еще не понимаю вашего мнения о шрифтах. rst2html5 не выводит 0xC2 0xA3, когда он встречает 0xC2 0xA3, когда я указал utf-8, поскольку и входы, и выходы, и шрифты там не действуют.

pupeno 28.11.2018 11:33

Похоже, что вывод тоже является разновидностью UTF-16… !?

deceze 28.11.2018 11:37

@deceze: я так думал, но, к счастью, я не слишком хорошо знаком с рассмотрением UTF-16 на этом уровне (или с проблемами кодировки UTF-16). Большая часть того, с чем мне приходилось иметь дело с utf-8 против latin-1, latin-15 и т. д.

pupeno 28.11.2018 11:38

@deceze: файл начинается с 0xFF 0xFE, который является спецификацией UTF-16, поэтому я думаю, что вы правы, и это UTF-16

pupeno 28.11.2018 11:41

(Почти) каждый второй символ в шестнадцатеричном редакторе, равный 00, означает, что это UTF-16. Вы можете попробовать iconv -f utf-16 -t utf-8 foo.html с документом (если у вас установлен iconv).

AKX 28.11.2018 11:41

@AKX 2C25FA00 все еще далек от правильной кодировки для £ в UTF-16, так что даже это не поможет.

deceze 28.11.2018 11:44

@AKX: Я установил iconv и попробовал. Ага, не UTF-16.

pupeno 28.11.2018 11:46

Вам, вероятно, следует просто спросить автора. Я полагаю, это тот инструмент, о котором вы говорите: github.com/marianoguerra/rst2html5

tripleee 28.11.2018 11:47

Спасибо за разъяснение вопроса. Как следует из приведенного здесь обсуждения, когда вы видите глиф £, мы все еще не понимаем, какой именно шрифт и кодировку вы используете. Шестнадцатеричные байты - единственный способ однозначно и лаконично определить, что находится в файле.

tripleee 28.11.2018 11:48

Места могут что-то испортить. Какая у вас кодовая страница Windows и можете ли вы создать действительный UTF-8 из других скриптов Python?

tripleee 28.11.2018 11:53

@tripleee: я не знаю, какая у меня кодовая страница Windows. Как мне узнать? Да, у меня был сценарий Python, который я написал, для создания первого файла, который является правильным UTF-8.

pupeno 28.11.2018 11:54

Я считаю, что chcp должен распечатать вашу кодовую страницу, хотя я обычно рекомендую полностью избавиться от Windows, если у вас возникли проблемы.

tripleee 28.11.2018 11:55

@tripleee: я не могу избавиться от Windows. Активная кодовая страница: 437.

pupeno 28.11.2018 11:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
20
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема была вызвана перенаправлением PowerShell, а не самим rst2html5. Запускаем так:

 rst2html5 --input-encoding=utf-8 --output-encoding=utf-8 foo.rst foo.html

который имеет тот же эффект, что и перенаправление (>), сработало хорошо, и использование перенаправления на CMD также сработало.

Если у кого-то есть дополнительная информация о том, почему PowerShell портит кодировку, было бы хорошо добавить сюда.

Другие вопросы по теме