Как исправить недопустимые символы HTML на страницах, которые обслуживаются с другой кодировкой? - PullRequest
8 голосов
/ 30 сентября 2010

У меня есть несколько сайтов, которые отображают недопустимые символы. Метатеги страниц определяют кодировку UTF-8. Однако на некоторых страницах содержатся символы, которые не могут быть интерпретированы UTF-8, возможно, из-за того, что файлы были сохранены в другой кодировке (например, ANSI). В частности, меня сейчас волнует причудливый апостроф (как в " Bob's " ... извините, если это не отображается правильно). Валидатор W3 указывает, что сущность является « \ x92 », но он не будет проверять файл, потому что он не отображается в Юникод. И, конечно же, если я открою файл в Notepad ++ и поменяю кодировку на UTF-8, символ заменяется на 92 в черном поле.

Вот мой вопрос: как проще всего это исправить? Нужно ли открывать все страницы и заменять этот символ обычным апострофом? Или я мог бы добавить быстрое исправление (скажем, в IIS), которое могло бы переопределить или устранить проблему с кодировкой? Или я должен перебор найти / заменить? У меня есть сотни страниц на этих веб-сайтах, и я не представляю, сколько из них мне придется изменить, поэтому, если кто-нибудь знает, каким образом я мог бы обойти эту проблему или быстро решить ее, я был бы признателен.

Ответы [ 4 ]

2 голосов
/ 30 сентября 2010

Вы обслуживаете страницы как обычный HTML, или у вас есть другой скрипт, обслуживающий контент?Если у вас есть скрипт, который обслуживает контент, этот скрипт может просто найти любой экземпляр \ x92 и заменить его апострофом.В PHP это было бы просто str_replace ()

Если вы работаете с прямым HTML, вам придется фактически изменить сами файлы.Однако это может быть автоматизировано (и, вероятно, должно быть, если у вас есть сотни файлов), в зависимости от того, какие инструменты у вас есть и в какой операционной системе вы находитесь. Поскольку вы сказали, что используете Notepad ++, я полагаю, можно предположитьвы находитесь в MS Windows (поэтому нет забавных команд Unix для ускорения процесса)

Однако, возможно, можно создать сценарий BATCH, который сможет это сделать.В командную строку встроены очень простые инструменты редактирования текста ASCII.Если это невозможно, то очень возможно сделать программу на C или C ++, чтобы сделать это, если у вас есть компилятор в вашей системе и умеренное знание C. Если у вас есть первое, а не второе, спросите, и я подберу некоторыеисточник для вас.

1 голос
/ 26 августа 2016

Я только что столкнулся с подобной проблемой, когда некоторые неразрывные пробелы "xA0" попали в документ предположительно UTF-8. В блокноте ++ они отображаются в черном поле с надписью «xA0». Однако notepad ++ не позволяет их копировать или вставлять.

Я провел небольшое исследование и выяснил, что происходит. Шестнадцатеричный редактор показывает, что они кодируются одним байтом: «A0», который является недействительным UTF-8. Все, что не ASCII, должно быть не менее двух байтов, поэтому правильная кодировка - "C2 A0" в шестнадцатеричном формате.

Для примера с апострофами вы имеете дело с тем же. Однако на самом деле ваша проблема более сложная, потому что в расширенном символе ascii \ x92 (десятичное число 146) - это апостроф, а в unicode \ x92 - управляющий символ, и правильная одиночная кавычка должна быть U + 2019 (десятичное число 8217). Добавление этого символа в notepad ++ (через панель «Правка» -> «Символ») и проверка в шестнадцатеричном редакторе показывает, что правильное шестнадцатеричное кодирование - это «E2 80 99», а в двоичном виде - 1110 0010 10 000000 * 1008. * 10 011001 . Когда вы удаляете управляющие байты UTF-8 (не выделены жирным шрифтом), это дает 0010 0000 0000 0001 1001, что равно десятичному значению 8217.

Правильный способ обработки этого - открыть ваш файл в виде потока байтов (без знака char * в c) и искать неправильные последовательности UTF-8. Затем вы можете либо заменить их на (см. https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences), либо попытаться их обработать по своему усмотрению, сделав такие замены, как A0 -> C2 A0 (неправильно закодированный неразрывный пробел) и 92 -> E2 80 99 (неправильно закодированная правая одинарная кавычка).

1 голос
/ 30 сентября 2010

Я сам не уверен насчет кодирующей части, но если вам придётся делать это грубо, вы всегда можете написать короткую программу, которая перебирает все ваши веб-страницы, загружает каждый файл в память, запускает regex.replace, чтобы исправить символ проблемы, и сохраняет файл обратно на диск.Очевидно, что не идеально, но лучше, чем открывать каждый файл самостоятельно.

Удачи

0 голосов
/ 30 сентября 2010

Все специальные символы должны быть в кодировке HTML, например, символ авторского права должен присутствовать в вашем HTML как

©

Список объектов HTML:

http://www.w3schools.com/HTML/html_entities.asp

AsТо, как вы реализуете это, во многом зависит от того, как вы создаете код в первую очередь, но что-то вроде ASP.Net будет иметь функции на стороне сервера, такие как:

Server.HTMLEncode("string with special chars")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...