Проблемы с кодировкой HTML-символ" Â " появляется вместо " "

у меня есть устаревшее приложение, которое только начинает плохо себя вести, по какой-то причине я не уверен. Он генерирует кучу HTML, которая превращается в PDF-отчеты ActivePDF.

процесс выглядит так:

  1. вытащите HTML-шаблон из БД с токенами в нем для замены (например, " ~CompanyName~", "~CustomerName~ " и т. д.)
  2. замените токены реальными данными
  3. Tidy HTML с простой функцией regex, что свойство форматирует HTML-тег значения атрибутов (обеспечивает кавычки и т. д., поскольку механизм рендеринга ActivePDF ненавидит все, кроме одинарных кавычек вокруг значений атрибутов)
  4. отправить HTML в веб-службу, которая создает PDF.

где-то в этом беспорядке, неразрывные пробелы из шаблона HTML ( s) кодируются как ISO-8859-1, так что они отображаются неправильно как символ "Â" при просмотре документа в браузере (FireFox). ActivePDF блюет на эти не-UTF8 письмена.

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

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

какие идеи?

EDIT:

я справляюсь с этим сейчас, хотя это вряд ли это кажется хорошим решением:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^u0000-u007F]", " ")
End Function

7 ответов


где-то в этом беспорядке неразрывные пробелы из шаблона HTML (s) кодируются как ISO-8859-1, так что они отображаются неправильно как символ "Â"

это будет кодировка UTF-8, а не ISO-8859-1. Символ неразрывного пробела-байт 0xA0 в ISO-8859-1; при кодировании в UTF-8 это будет 0xC2,0xA0, который, если вы (неправильно) просмотрите его как ISO-8859-1, выйдет как " ". Это включает в себя трейлинг nbsp, который вы, возможно, не заметили; если этого байта нет, затем что-то еще искалечило ваш документ, и нам нужно посмотреть дальше, чтобы узнать, что.

что такое регулярное выражение,как работает шаблон? Казалось бы, где-то есть правильный парсер HTML, если ваш   строки (правильно) превращаются в символы неразрывного пробела U+00A0. Если это так, вы можете просто обработать свой шаблон изначально в DOM и попросить его сериализовать, используя кодировку ASCII, чтобы сохранить символы, отличные от ASCII ссылки на литературу. Это также избавит вас от необходимости выполнять пост-обработку регулярных выражений в самом HTML, что всегда является очень изворотливым делом.

ну в любом случае, на данный момент вы можете добавить одно из следующих в <head> и посмотреть, если это заставляет его смотреть прямо в браузере:

  • для HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • для HTML5: <meta charset="utf-8">

если вы это сделали, то любая оставшаяся проблема является ошибкой ActivePDF.


Если у кого-то была такая же проблема, как у меня, и кодировка была уже правильной, просто сделайте это:

  1. скопируйте весь код внутри .HTML-файл.
  2. откройте блокнот (или любой основной текстовый редактор) и вставьте код.
  3. Перейти "Файл - > Сохранить Как"
  4. введите имя файла " пример.html "(выберите " Сохранить как тип: все файлы (.)")
  5. выберите кодировку как UTF-8
  6. нажмите Сохранить, и теперь вы можете удалить ваши старые .HTML-файл и кодировка должна быть закреплена

проблема: Даже я столкнулся с проблемой, куда мы отправляли '£' С некоторой строкой в запросе POST в CRM-систему, но когда мы делали вызов GET из CRM, он возвращался '£Â' С некоторым содержимым строки. Итак, мы проанализировали то, что '£' преобразуется в '£Â'.

анализ: Глюк, который мы обнаружили после проведения исследования, заключается в том, что в POST call мы установили Класса HttpWebRequest ContentType как "text / xml" в то время как в GET Call это было "text / xml; charset: utf-8".

устранение: Таким образом, в качестве части решения мы включили кодировка: utf-8 в запросе POST и он работает.


в моем случае я получал латинский крест вместо nbsp, даже то, что страница была правильно закодирована в UTF-8. Ничто из вышеперечисленного не помогло в решении проблемы, и я попробовал все.

в конце концов изменение шрифта для IE (с конкретным браузером css) помогло, я использовал Helvetica-Nue в качестве шрифта тела, изменяющегося на Arial, решил проблему .


Ну, у меня тоже есть эта проблема на моих нескольких сайтах, и все, что мне нужно сделать, это настроить контент fetler для HTML entites. перед этим я удаляю их больше, поэтому просто измените HTML Fitter или функцию синтаксического анализа для страницы, и это сработало. В основном это связано с редакторами HTML в большинстве CMSs. то, как они хранят анализ данных, вызвало эту проблему (в моем случае). Пусть это поможет и в вашем случае


У меня была такая же проблема. По-видимому, это просто потому, что PHP не распознает utf-8.

сначала я рвал на себе волосы, когда знак " £ "продолжал появляться как"£", несмотря на то, что он выглядел нормально в DreamWeaver. В конце концов я вспомнил, что у меня были проблемы со ссылками относительно индексного файла, когда страницы, если смотреть непосредственно, будут работать с слайд-шоу, но не при использовании с include (но это не имеет значения. В любом случае, мне было интересно, может ли это быть аналогичная проблема, поэтому вместо того, чтобы поместить на страницу, с которой у меня были проблемы, я просто поместил ее в индекс.php файл-проблема исправлена во всем.


причина в том, что PHP не распознает utf-8.

здесь вы можете проверить его для всех специальных символов в HTML

http://www.degraeve.com/reference/specialcharacters.php