Problèmes de codage HTML - le caractère «Â» apparaît au lieu de «& nbsp;»


203

J'ai une application héritée qui commence à mal se comporter, pour une raison que je ne suis pas sûre. Il génère un tas de code HTML qui est transformé en rapports PDF par ActivePDF.

Le processus fonctionne comme ceci:

  1. Extraire un modèle HTML d'une base de données contenant des jetons à remplacer (par exemple "~ CompanyName ~", "~ CustomerName ~", etc.)
  2. Remplacez les jetons par des données réelles
  3. Ranger le HTML avec une fonction regex simple qui formate les valeurs d'attribut des balises HTML (garantit les guillemets, etc., car le moteur de rendu d'ActivePDF déteste tout sauf les guillemets simples autour des valeurs d'attribut)
  4. Envoyez le code HTML à un service Web qui crée le PDF.

Quelque part dans ce gâchis, les espaces insécables du ou des modèles HTML  sont codés en ISO-8859-1 de sorte qu'ils s'affichent incorrectement en tant que caractère "Â" lors de l'affichage du document dans un navigateur (FireFox). ActivePDF lance sur ces caractères non UTF8.

Ma question: comme je ne sais pas d'où vient le problème et que je n'ai pas le temps d'enquêter, existe-t-il un moyen facile de ré-encoder ou de trouver et de remplacer les mauvais caractères? J'ai essayé de l'envoyer à travers cette petite fonction que j'ai jeté ensemble, mais cela transforme tout en bouffon ne change rien.

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

Des idées?

ÉDITER:

Je m'en sors pour l'instant, même si cela ne semble pas être une bonne solution:

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

2
Le HTML contient-il des méta-informations pour décrire son jeu de caractères?
Rowland Shaw

1
[Commentaire précédent supprimé] Réponse courte: non.
Cᴏʀʏ

1
Pour moi, j'ai travaillé: utf8_decode ()
ursuleacv

Réponses:


340

Quelque part dans ce gâchis, les espaces insécables du ou des modèles HTML sont codés en ISO-8859-1 de sorte qu'ils s'affichent incorrectement sous la forme d'un caractère "Â"

Ce serait alors un encodage en UTF-8, pas en ISO-8859-1. Le caractère d'espace insécable est l'octet 0xA0 dans ISO-8859-1; lorsqu'il est encodé en UTF-8, ce serait 0xC2,0xA0, qui, si vous le voyez (incorrectement) comme ISO-8859-1, apparaît " ". Cela inclut un nbsp final que vous pourriez ne pas remarquer; si cet octet n'est pas là, alors quelque chose d'autre a malmené votre document et nous devons voir plus loin pour savoir quoi.

Quelle est l'expression rationnelle, comment fonctionne le modèle? Il semblerait qu'un analyseur HTML approprié soit impliqué quelque part si votre  chaînes sont (correctement) transformées en caractères U + 00A0 NON-BREAKING SPACE. Si c'est le cas, vous pouvez simplement traiter votre modèle en mode natif dans le DOM et lui demander de sérialiser en utilisant le codage ASCII pour conserver les caractères non ASCII comme références de caractères. Cela vous empêcherait également d'avoir à effectuer un post-traitement regex sur le HTML lui-même, ce qui est toujours une entreprise très douteuse.

Eh bien de toute façon, pour l'instant, vous pouvez ajouter l'un des éléments suivants à votre document <head>et voir si cela donne une apparence correcte dans le navigateur:

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

Si vous l'avez fait, tout problème restant est la faute d'ActivePDF.


20
Je ne recommanderais pas <meta charset="utf-8">encore. La http-equivversion est toujours valide en HTML5 et est mieux prise en charge.
bobince

8
Réponses parmi lesquelles utiliser: <meta charset = 'utf-8'> vs <meta http-equiv = 'Content-Type' indique que la version courte est bien prise en charge.
Richard Ayotte


Cela fonctionne dans tous les navigateurs modernes . Cela ne fonctionne certainement pas dans tous les navigateurs hérités et de niche (par exemple mobiles), ou sur toutes les araignées.
bobince

3
"Quelque part dans ce gâchis" ... LOL! Bien ouvert! Bonne réponse! +1
Resist Design

24

Si quelqu'un a eu le même problème que moi et que le jeu de caractères était déjà correct, faites simplement ceci:

  1. Copiez tout le code dans le fichier .html.
  2. Ouvrez le bloc-notes (ou n'importe quel éditeur de texte de base) et collez le code.
  3. Allez "Fichier -> Enregistrer sous"
  4. Entrez votre nom de fichier "example.html" (Sélectionnez "Enregistrer sous le type: Tous les fichiers ( . )")
  5. Sélectionnez Encoding comme UTF-8
  6. Appuyez sur Enregistrer et vous pouvez maintenant supprimer votre ancien fichier .html et l'encodage devrait être corrigé

2
Cela l'a fait pour moi. Maintenant, en sublime, il dit UTF-8 with BOMau lieu de UTF-8. Pour voir cela en texte sublime, vous devez show_encodingdéfinir truedans Paramètres - Utilisateur.
J86

J'ai eu le problème en affichant  au lieu de », amd Lors de l'utilisation de cette solution, le problème a été résolu mais il y a un avertissement 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

Cette solution a fonctionné pour moi. Je travaillais dans notepad ++, et quand je l'ai enregistré dans le bloc-notes ms de base en tant que UTF-8, après avoir ouvert le nouveau fichier dans notepad ++, l'encodage a été défini sur UTF-8-BOM (dont je ne sais pas exactement ce que signifie). Quoi qu'il en soit, cela semble avoir été le problème pour moi.
BoltKey

Je vous remercie! Cela a fait l'affaire. Je vois dans la demande / réponse que le fichier (dans mon cas, ASPX) a été encodé en UTF-8. Notepad ++ l'avait également encodé en UTF-8. Que diable, non? Mais votre solution a fait l'affaire. Pour moi, c'était une phrase espagnole qui n'était pas encodée correctement sur la page. J'ai lu ailleurs pour ne pas utiliser la nomenclature UTF-8 pour l'espagnol mais cela l'a corrigé pour moi.
user3621633

13

Problème: même si j'étais confronté au problème où nous envoyions '£' avec une chaîne dans la demande POST au système CRM, mais lorsque nous faisions l'appel GET à partir de CRM, il retournait 'Â £' avec du contenu de chaîne. Donc, ce que nous avons analysé, c'est que «£» était converti en «Â £» .

Analyse: Le problème que nous avons trouvé après avoir fait des recherches est que dans l'appel POST, nous avons défini HttpWebRequest ContentType comme "text / xml" tandis que dans GET Call, c'était "text / xml; charset: utf-8" .

Solution: Donc, comme partie de la solution, nous avons inclus le jeu de caractères: utf-8 dans la demande POST et cela fonctionne.


0

Dans mon cas, cela (un avec caret) s'est produit dans le code que j'ai généré à partir de Visual Studio en utilisant mon propre outil pour générer du code. C'était facile à résoudre:

Sélectionnez des espaces simples () dans le document. Vous devriez pouvoir voir de nombreux espaces simples qui sont différents des autres espaces simples, ils ne sont pas sélectionnés. Sélectionnez ces autres espaces simples - ce sont eux qui sont responsables des caractères indésirables dans le navigateur. Accédez à Rechercher et remplacer par un espace unique (). Terminé.

PS: Il est plus facile de voir tous les personnages similaires lorsque vous placez le curseur sur l'un ou si vous le sélectionnez dans VS2017 +; J'espère que d'autres IDE peuvent avoir des fonctionnalités similaires


-1

Dans mon cas, je recevais un signe de croix latin au lieu de nbsp, même si une page était correctement encodée en UTF-8. Rien de ce qui précède n'a aidé à résoudre le problème et j'ai tout essayé.

À la fin, la modification de la police pour IE (avec un CSS spécifique au navigateur) a aidé, j'utilisais Helvetica-Nue comme police de corps en Arial a résolu le problème.


La raison pour laquelle le changement de police peut avoir aidé peut-être parce que l'une des polices ne contenait pas le caractère en question, donc ce que vous avez vu était un caractère vide à la place. Mais cela n'a pas résolu le problème, cela n'a fait que le couvrir.
Oliver Hausler

-2

J'avais le même genre de problème. Apparemment, c'est simplement parce que PHP ne reconnaît pas utf-8.

Au début, je me déchirais les cheveux quand un signe «£» apparaissait comme «Â £», même s'il semblait correct dans DreamWeaver. Finalement, je me suis souvenu que j'avais eu des problèmes avec les liens par rapport au fichier d'index, lorsque les pages, si elles étaient consultées directement, fonctionneraient avec des diaporamas, mais pas lorsqu'elles étaient utilisées avec une inclusion (mais ce n'est pas la question. Quoi qu'il en soit, je me demandais si cela pouvait être un problème similaire, donc au lieu de mettre dans la page avec laquelle j'ai eu des problèmes, je l'ai simplement mis dans le fichier index.php - problème résolu tout au long.



-2

Eh bien, j'ai aussi eu ce problème dans mes quelques sites Web et tout ce que je dois faire est de personnaliser le filtreur de contenu pour les entites HTML. avant cela, plus je les supprime, plus j'obtiens, il vous suffit donc de changer votre filtre html ou la fonction d'analyse de la page et cela a fonctionné. C'est principalement dû aux éditeurs HTML dans la plupart des CMS. la façon dont ils stockent l'analyse des données a provoqué ce problème (dans mon cas). Que cela vous aide aussi

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.