У меня есть программа Python, написанная в UTF-8, что подтверждается PyCharm и Sublime Text. Он выводит символ фунта, £ (0xC2 0xA3), в повторно структурированный текст:
Открытие файла 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 также показывает ┬ú вместо £. Это актуальные данные:
Есть идеи, что происходит или как это остановить? Это вообще похоже на UTF-8?
Сгенерированный файл начинается так:
0xFF 0xFE напоминает мне Спецификация UTF-16, но установка заголовка на <meta charset = "utf-16" /> не решает проблему и требует, чтобы текстовый редактор открыл файл, поскольку UTF-16 по-прежнему показывает, что символ не ASCII нарушен.
Если это актуально, моя активная кодовая страница Windows - 437.
Вы просматриваете HTML-файл локально? Есть ли у него заголовок http-equiv, определяющий его кодировку? Если вы просматриваете его с веб-сервера, какие заголовки прикрепляет сервер?
@tripleee: Я добавил информацию о том, что я имею в виду под претензиями. Позвольте мне получить шестнадцатеричный редактор, и я получу фактические байты, но, разобравшись со многими проблемами кодирования, приведенными ниже, я вполне уверен, что это не проблема декодирования, а проблема кодирования.
@tripleee: я просматриваю файл локально, Chrome в Windows.
То, что вы видите, совершенно не имеет значения без информации о том, какие у вас шрифты и т. д. См. Также страница с информацией о теге Stack Overflow character-encoding
@tripleee: я понимаю, что шрифты будут влиять на необычные символы, но почти каждый шрифт и, конечно же, каждый шрифт по умолчанию имеет в себе символ фунта.
Вы явно не читали страницу, на которую я дал ссылку. И снова ссылка: ссылка на сайт
@tripleee: я прочитал страницу. Вы просили шестнадцатеричное представление, и я его получил. Я все еще не понимаю вашего мнения о шрифтах. rst2html5 не выводит 0xC2 0xA3, когда он встречает 0xC2 0xA3, когда я указал utf-8, поскольку и входы, и выходы, и шрифты там не действуют.
Похоже, что вывод тоже является разновидностью UTF-16… !?
@deceze: я так думал, но, к счастью, я не слишком хорошо знаком с рассмотрением UTF-16 на этом уровне (или с проблемами кодировки UTF-16). Большая часть того, с чем мне приходилось иметь дело с utf-8 против latin-1, latin-15 и т. д.
@deceze: файл начинается с 0xFF 0xFE, который является спецификацией UTF-16, поэтому я думаю, что вы правы, и это UTF-16
(Почти) каждый второй символ в шестнадцатеричном редакторе, равный 00, означает, что это UTF-16. Вы можете попробовать iconv -f utf-16 -t utf-8 foo.html с документом (если у вас установлен iconv).
@AKX 2C25FA00 все еще далек от правильной кодировки для £ в UTF-16, так что даже это не поможет.
@AKX: Я установил iconv и попробовал. Ага, не UTF-16.
Вам, вероятно, следует просто спросить автора. Я полагаю, это тот инструмент, о котором вы говорите: github.com/marianoguerra/rst2html5
Спасибо за разъяснение вопроса. Как следует из приведенного здесь обсуждения, когда вы видите глиф £, мы все еще не понимаем, какой именно шрифт и кодировку вы используете. Шестнадцатеричные байты - единственный способ однозначно и лаконично определить, что находится в файле.
Места могут что-то испортить. Какая у вас кодовая страница Windows и можете ли вы создать действительный UTF-8 из других скриптов Python?
@tripleee: я не знаю, какая у меня кодовая страница Windows. Как мне узнать? Да, у меня был сценарий Python, который я написал, для создания первого файла, который является правильным UTF-8.
Я считаю, что chcp должен распечатать вашу кодовую страницу, хотя я обычно рекомендую полностью избавиться от Windows, если у вас возникли проблемы.
@tripleee: я не могу избавиться от Windows. Активная кодовая страница: 437.






Проблема была вызвана перенаправлением PowerShell, а не самим rst2html5. Запускаем так:
rst2html5 --input-encoding=utf-8 --output-encoding=utf-8 foo.rst foo.html
который имеет тот же эффект, что и перенаправление (>), сработало хорошо, и использование перенаправления на CMD также сработало.
Если у кого-то есть дополнительная информация о том, почему PowerShell портит кодировку, было бы хорошо добавить сюда.
"Претендует на", а не? Или это на самом деле? Какие шестнадцатеричные байты используются для кодирования символа £? В UTF-8 это должно быть 0xC2 0xA3.