Проблемы с кодировкой HTML-символ" Â " появляется вместо " "
у меня есть устаревшее приложение, которое только начинает плохо себя вести, по какой-то причине я не уверен. Он генерирует кучу HTML, которая превращается в PDF-отчеты ActivePDF.
процесс выглядит так:
- вытащите HTML-шаблон из БД с токенами в нем для замены (например, " ~CompanyName~", "~CustomerName~ " и т. д.)
- замените токены реальными данными
- Tidy HTML с простой функцией regex, что свойство форматирует HTML-тег значения атрибутов (обеспечивает кавычки и т. д., поскольку механизм рендеринга ActivePDF ненавидит все, кроме одинарных кавычек вокруг значений атрибутов)
- отправить 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.
Если у кого-то была такая же проблема, как у меня, и кодировка была уже правильной, просто сделайте это:
- скопируйте весь код внутри .HTML-файл.
- откройте блокнот (или любой основной текстовый редактор) и вставьте код.
- Перейти "Файл - > Сохранить Как"
- введите имя файла " пример.html "(выберите " Сохранить как тип: все файлы (.)")
- выберите кодировку как UTF-8
- нажмите Сохранить, и теперь вы можете удалить ваши старые .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