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:
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
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:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta charset="utf-8">
Si vous avez fait cela, alors tout problème restant est la faute d'ActivePDF.
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:
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.