Проблемы с кодировкой HTML - символ отображается вместо

У меня устаревшее приложение только начинает плохо себя вести, по какой-то причине я не уверен. Он генерирует набор 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

Любые идеи?

РЕДАКТИРОВАТЬ:

Я пока обхожусь с этим, хотя это вряд ли кажется хорошим решением:

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

person Cᴏʀʏ    schedule 22.09.2009    source источник
comment
Содержит ли HTML какую-либо метаинформацию для описания его набора символов?   -  person Rowland Shaw    schedule 22.09.2009
comment
[Предыдущий комментарий удален] Краткий ответ: нет.   -  person Cᴏʀʏ    schedule 22.09.2009
comment
У меня сработало: utf8_decode ()   -  person ursuleacv    schedule 23.02.2017


Ответы (8)


Где-то в этом беспорядке неразрывные пробелы из шаблона 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 NON-BREAKING SPACE. Если это так, вы можете просто обработать свой шаблон изначально в DOM и попросить его сериализовать, используя кодировку ASCII, чтобы сохранить символы, отличные от ASCII, в качестве ссылок на символы. Это также избавит вас от необходимости выполнять пост-обработку регулярных выражений в самом HTML, что всегда является очень хитрым делом.

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

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

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

person bobince    schedule 22.09.2009
comment
Я бы пока не рекомендовал <meta charset="utf-8">. Версия http-equiv все еще действительна в HTML5 и лучше поддерживается. - person bobince; 19.02.2012
comment
Ответы от http://stackoverflow.com/questions/4696499/which-one-to-use-meta-charset-utf-8-vs-meta-http-equiv-content-type указывает, что короткая версия хорошо поддерживается. - person Richard Ayotte; 19.02.2012
comment
Обнаружен другой источник. Это работает во всех браузерах - person Richard Ayotte; 19.02.2012
comment
Он работает во всех современных браузерах. Это определенно не работает во всех устаревших и нишевых (например, мобильных) браузерах или на всех пауках. - person bobince; 19.02.2012
comment
Где-то в этом беспорядке ... LOL! Открыто здорово! Хороший ответ! +1 - person Resist Design; 03.09.2012
comment
Хороший, была такая же проблема с генератором PDF asp.net и AspPDF. Поместил его в начало страницы, и теперь все в порядке. - person Иво Недев; 04.06.2015
comment
@bobince это отличный ответ :) - person Ivin Raj; 24.09.2015
comment
Работает с генератором HTML / PDF Вт Печкин и в .NET. Отличное исправление! - person cscott530; 11.07.2017
comment
@bobince вы, сэр, спасли мне день! +1 один :) - person John Skoumbourdis; 10.04.2018

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

  1. Скопируйте весь код в файл .html.
  2. Откройте блокнот (или любой простой текстовый редактор) и вставьте код.
  3. Выберите "Файл -> Сохранить как".
  4. Введите имя файла "example.html" (выберите "Тип файла: Все файлы (.)")
  5. Выберите кодировку как UTF-8
  6. Нажмите «Сохранить», и теперь вы можете удалить свой старый файл .html, а кодировку следует исправить.
person Low    schedule 04.07.2012
comment
Это сделало это для меня. Теперь в возвышенном он говорит UTF-8 with BOM вместо UTF-8. Чтобы увидеть это в возвышенном тексте, вам нужно show_encoding установить в true в Настройках - Пользователь. - person J86; 31.12.2013
comment
У меня была проблема с отображением Â вместо », amd. При использовании этого решения проблема решена, но появляется предупреждение php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152 - person SCC; 06.03.2014
comment
Это решение сработало для меня. Я работал в блокноте ++, и когда я сохранил его в базовом блокноте MS как UTF-8, после открытия нового файла в блокноте ++ кодировка была установлена ​​на UTF-8-BOM (что я не уверен, что означает). Во всяком случае, это, кажется, было для меня проблемой. - person BoltKey; 18.03.2017
comment
Спасибо! Это сработало. Я вижу, что в запросе / ответе файл (в моем случае ASPX) был закодирован как UTF-8. Notepad ++ также закодировал его в UTF-8. Какого черта, правда? Но ваше решение сделало свое дело. Для меня это была испанская фраза, которая неправильно кодировалась на странице. Я читал в другом месте, чтобы не использовать спецификацию UTF-8 для испанского языка, но он исправил это для меня. - person user3621633; 12.07.2019

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

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

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

person Himanshu Tarsoliya    schedule 24.09.2015

В моем случае это (с кареткой) произошло в коде, который я сгенерировал из Visual Studio с помощью моего собственного инструмента для генерации кода. Решить было несложно:

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

PS: Все похожие символы легче увидеть, если навести курсор на одного или выбрать его в VS2017 +; Я надеюсь, что другие IDE могут иметь аналогичные функции

person Hannington Mambo    schedule 15.02.2020

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

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

person Mohika    schedule 04.11.2013
comment
Причина, по которой переключение шрифта могло помочь, может заключаться в том, что один из шрифтов не содержал рассматриваемого символа, поэтому вместо этого вы видели пустой символ. Но это не решило проблему, а только прикрыло ее. - person Oliver Hausler; 24.10.2019

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

person JK-Ryder    schedule 25.03.2016

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

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

person FourPart    schedule 16.12.2013

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

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

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

person al123    schedule 05.06.2014
comment
Это не вопрос PHP, это VB.NET. - person Cᴏʀʏ; 05.06.2014
comment
я нет, но вы можете использовать эти символы для решения проблемы. это исправило мое решение. - person al123; 05.06.2014