Проблемы с кодировкой HTML - вместо "" появляется символ "" - PullRequest
191 голосов
/ 22 сентября 2009

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

Процесс работает так:

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

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

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

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 ]

324 голосов
/ 22 сентября 2009

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

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

Что такое регулярное выражение, как работает шаблон? Может показаться, что где-то задействован надлежащий 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.

23 голосов
/ 04 июля 2012

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

  1. Скопируйте весь код из файла .html.
  2. Откройте блокнот (или любой основной текстовый редактор) и вставьте код.
  3. Перейти "Файл -> Сохранить как"
  4. Введите имя файла «example.html» (выберите «Сохранить как тип: Все файлы (. )»)
  5. Выберите кодировку как UTF-8
  6. Нажмите Сохранить, и теперь вы можете удалить старый HTML-файл, и кодировка должна быть исправлена ​​
11 голосов
/ 24 сентября 2015

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

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

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

0 голосов
/ 25 марта 2016

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

0 голосов
/ 05 июня 2014

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

Здесь вы можете проверить все специальные символы в HTML

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

0 голосов
/ 17 декабря 2013

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

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

0 голосов
/ 04 ноября 2013

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

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

...