web-dev-qa-db-fra.com

Problèmes d'encodage HTML - Caractère "Â" affiché à la place de "nbsp;"

J'ai une ancienne application qui commence à mal se comporter, pour une raison quelconque, je n'en suis pas sûre. Il génère un tas de HTML qui est transformé en PDF rapports 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. Remplacer les jetons avec des données réelles
  3. Nettoyez le code HTML avec une simple fonction regex qui convertit les valeurs des attributs d'attributs HTML (garantit les guillemets, etc., car le moteur de rendu d'ActivePDF déteste tout sauf les guillemets simples autour des valeurs d'attributs)
  4. Envoyez le code HTML à un service Web qui crée le PDF.

Quelque part dans ce gâchis, les espaces insécables du modèle HTML (le  s) sont codés en tant que ISO-8859-1 de sorte qu’ils ne s'affichent pas correctement sous la forme d'un caractère "Â" lors de la visualisation du document dans un navigateur ( FireFox). ActivePDF utilise ces caractères non UTF8.

Ma question: étant donné que je ne sais pas d'où vient le problème et que je n'ai pas le temps de l'explorer, existe-t-il un moyen simple de ré-encoder ou de rechercher et de remplacer les caractères incorrects? J'ai essayé de l'envoyer à travers cette petite fonction que j'ai jeté ensemble, mais ça transforme tout en gobbledegook 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?

EDIT:

Je me débrouille pour le moment, même si cela ne semble guère être une bonne solution:

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

Quelque part dans ce gâchis, les espaces insécables du modèle HTML (les s) sont codés en tant que ISO-8859-1 de sorte qu’ils ne s'affichent pas correctement sous la forme d'un caractère "Â".

Ce serait encoder en UTF-8 alors, pas ISO-8859-1. Le caractère d'espace insécable est l'octet 0xA0 dans ISO-8859-1; une fois encodé en UTF-8, ce sera 0xC2,0xA0, qui, si vous le visualisez (à tort) comme ISO-8859-1, sortira comme " ". Cela inclut un nbsp de fin que vous pourriez ne pas remarquer; Si cet octet n'existe pas, votre document est endommagé par quelque chose d'autre et nous devons voir plus haut pour savoir quoi.

Quelle est l'expression rationnelle, comment fonctionne le template? Il semblerait qu'un analyseur HTML approprié soit impliqué quelque part si vos chaînes   sont correctement transformées en caractères U + 00A0 NON-BREAKING SPACE. Si tel est le cas, vous pouvez simplement traiter votre modèle de manière native dans le DOM et lui demander de se sérialiser à l'aide du codage ASCII pour conserver les caractères non-ASCII en tant que références de caractères. Cela vous éviterait également de faire du post-traitement regex sur le code HTML lui-même, qui est toujours une activité très risquée.

Quoi qu’il en soit, pour le moment, vous pouvez ajouter l’un des éléments suivants au <head> de votre document et voir si cela lui donne une apparence exacte dans le navigateur:

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

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

325
bobince

Si quelqu'un avait le même problème que moi et que le jeu de caractères était déjà correct, procédez comme suit:

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

Problème: Même si je faisais face au problème d'envoi '£' avec une chaîne dans la demande POST au système CRM, mais quand nous le faisions l’appel GET de CRM, il retournait 'Â £' avec un contenu de chaîne. Nous avons donc analysé le fait que '£' était converti en '£'.

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

Solution: Donc, en tant que partie de la solution, nous avons inclus la requête charset: utf-8 dans POST et cela fonctionne.

11
Himanshu Tarsoliya