Проблеми з кодуванням HTML - символ "Â" відображається замість "& nbsp;"


203

У мене застарілий додаток лише починає погано поводитись, з якої причини я не впевнений. Це створює купу HTML, яка перетворюється на PDF-звіти від ActivePDF.

Процес працює так:

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

Десь у цьому безладі нерозривні пробіли з шаблонів HTML  кодують як 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

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, виходить як " ". Це включає в себе зворотний 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.


20
Я б ще не рекомендував <meta charset="utf-8">. http-equivВерсія все ще діє в HTML5 і краще підтримується.
bobince

8
Відповіді, з яких саме користуватися: <meta charset = 'utf-8'> vs <meta http-equiv = 'Content-Type' зазначають, що коротка версія підтримується добре.
Річард Айотт

1
Знайдено ще одне джерело. Це працює у всіх браузерах
Річард Айотт,

Він працює у всіх сучасних браузерах. Це, звичайно, не працює в усіх застарілих і нішевих (наприклад, мобільних) браузерах або на всіх павуках.
bobince

3
"Десь у тому безладі" ... LOL! Приємно відкрити! Хороша відповідь! +1
Опір дизайну

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

Це рішення спрацювало на мене. Я працював у блокноті ++, і коли я зберег його в базовому блокноті ms як UTF-8, після відкриття нового файлу в блокноті ++ кодування було встановлено на UTF-8-BOM (що я не впевнений, що означає). У всякому разі, це, здається, було проблемою для мене.
BoltKey

Дякую! Це зробило трюк. Я бачу в запиті / відповіді файл (у моєму випадку ASPX) був закодований як UTF-8. Блокнот ++ також кодував його до UTF-8. Що за чорт, правда? Але ти вирішив, що зробив свою справу. Для мене це була іспанська фраза, кодована неправильно на сторінці. Я читав в інших місцях, щоб не використовувати UTF-8 BOM для іспанської мови, але це виправило для мене.
користувач3621633

13

Проблема: Навіть я зіткнувся з проблемою, коли ми надсилали '£' деяким рядком в POST-запиті до CRM System, але коли ми виконували дзвінок GET з CRM, він повертався '£ £' з деяким вмістом рядка. Отже, що ми проаналізували, це те, що "£" перетворювався на "£" .

Аналіз: Проблема, яку ми виявили після дослідження, полягає в тому, що в POST-дзвінку ми встановили HttpWebRequest ContentType як "text / xml", тоді як у GET Call це було "text / xml; charset: utf-8" .

Рішення: Отже, як частину рішення ми включили charset: utf-8 у POST-запит, і він працює.


0

У моєму випадку це (з каретою) сталося в коді, який я генерував із візуальної студії, використовуючи власний інструмент для генерації коду. Це було легко вирішити:

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

PS: простіше побачити всі подібні символи, коли ви кладете курсор на одного або якщо ви вибрали його в VS2017 +; Я сподіваюся, що інші ІДЕ можуть мати подібні функції


-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 fiter або функцію розбору сторінки, і вона спрацювала. В основному, це стосується редакторів HTML у більшості CMS. те, як вони зберігають дані аналізу, викликало цю проблему (У моєму випадку). Нехай це допоможе і у вашому випадку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.