Проблемы с кодировкой HTML - вместо символа & nbsp; появляется символ «Â»


203

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

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

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

Где-то в этом беспорядке неразрывные пробелы из шаблона (  ов) HTML кодируются как 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

Любые идеи?

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

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

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

2
Содержит ли HTML какую-либо метаинформацию для описания своего набора символов?
Роуланд Шоу

1
[Предыдущий комментарий удален] Краткий ответ: нет.
Cᴏʀʏ

1
У меня сработало: utf8_decode ()
ursuleacv

Ответы:


340

Где-то в этом беспорядке неразрывные пробелы из шаблона (ов) 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.


20
Я бы не рекомендовал <meta charset="utf-8">еще. http-equivВерсия все еще действует в HTML5 и лучше поддерживается.
bobince

8
Ответы от того, какой из них использовать: <meta charset = 'utf-8'> vs <meta http-экв = 'Content-Type' заявляют, что короткая версия хорошо поддерживается.
Ричард Айотт


Работает во всех современных браузерах. Это, конечно, не работает во всех старых и нишевых (например, мобильных) браузерах или на всех пауках.
bobince

3
"Где-то в этом беспорядке" ... LOL! Приятно открыть! Хороший ответ! +1
Resist Design

24

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

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

2
Это сделало это для меня. Теперь в возвышенном это говорит UTF-8 with BOMвместо UTF-8. Чтобы увидеть это в возвышенном тексте, вам нужно show_encodingустановить trueв Настройки - Пользователь.
J86

У меня была проблема с отображением «вместо», 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
SCC

Это решение сработало для меня. Я работал в notepad ++, и когда я сохранял его в базовом MS notepad как UTF-8, после открытия нового файла в notepad ++ кодировка была установлена ​​в UTF-8-BOM (что я не уверен, что означает). Во всяком случае, это, кажется, проблема для меня.
BoltKey

Спасибо! Это добилось цели. Я вижу в запросе / ответе файл (в моем случае ASPX) был закодирован как UTF-8. Notepad ++ также кодировал его в UTF-8. Какого черта, верно? Но вы решение сделали свое дело. Для меня это была испанская фраза, которая неправильно кодировалась на странице. Я читал в другом месте, чтобы не использовать UTF-8 BOM для испанского, но это исправило это для меня.
user3621633

13

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

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

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


0

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

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

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


-1

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

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


Причина, по которой переключение шрифта, возможно, помогло, может заключаться в том, что один из шрифтов не содержал соответствующего символа, поэтому вместо этого вы увидели пустой символ. Но это не решило проблему, а только скрыло ее.
Оливер Хауслер

-2

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

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


-2

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

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

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


1
Речь шла не о PHP, а о VB.NET.
Cᴏʀʏ

я нет, но вы можете использовать эти символы для решения проблемы. это исправило мое решение.
al123

-2

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.