Как исправить недопустимые символы HTML на страницах, обслуживаемых с другой кодировкой?

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

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

4 ответов


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

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

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


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

Удачи


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

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

для вашего причудливого примера Апострофа вы имеете дело с тем же самым. На самом деле, ваша проблема сложнее, потому что в расширенном ascii-символе \x92 (decimal 146) является Апострофом, но в unicode \x92 является управляющим символом, а правая одинарная кавычка должна быть U+2019 (decimal 8217). Добавление этого символа в notepad++ (через Панель Edit - >Character) и проверка в шестнадцатеричном редакторе показывает, что правильная шестнадцатеричная кодировка - "E2 80 99", которая в двоичной 11100010 10000000 10011001. При удалении байтов управления UTF-8 (не жирным шрифтом) это дает 0010 0000 0000 0001 1001, который равен десятичному значению 8217.

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


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

©

в HTML список:

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

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

Server.HTMLEncode("string with special chars")