it-swarm.com.de

HTML-Codierungsprobleme - "Â" Zeichen werden anstelle von "nbsp" angezeigt.

Ich habe eine Legacy-App, die sich gerade schlecht benimmt, aus irgendeinem Grund bin ich mir nicht sicher. Es wird eine Menge HTML generiert, die in PDF Berichte von ActivePDF umgewandelt wird.

Der Prozess funktioniert wie folgt:

  1. Ziehen Sie eine HTML-Vorlage aus einer Datenbank, in der sich Token befinden, die ersetzt werden sollen (z. B. "~ CompanyName ~", "~ CustomerName ~" usw.).
  2. Ersetzen Sie die Token durch echte Daten
  3. Bereinigen Sie den HTML-Code mit einer einfachen regulären Ausdrücke-Funktion, die HTML-Tag-Attributwerte formatiert (sorgt für Anführungszeichen usw., da das Rendering-Modul von ActivePDF alles andere als einfache Anführungszeichen um Attributwerte hasst).
  4. Senden Sie den HTML-Code an einen Webdienst, der die PDF-Datei erstellt.

Irgendwo in diesem Durcheinander sind die nicht unterbrechenden Leerzeichen aus der HTML-Vorlage (das  s) werden als ISO-8859-1 codiert, sodass sie beim Anzeigen des Dokuments in einem Browser (FireFox) fälschlicherweise als "Â" -Zeichen angezeigt werden. ActivePDF kotzt diese Nicht-UTF8-Zeichen an.

Meine Frage: Da ich nicht weiß, woher das Problem stammt, und keine Zeit habe, es zu untersuchen, gibt es eine einfache Möglichkeit, die schlechten Zeichen neu zu codieren oder zu finden und zu ersetzen? Ich habe versucht, es durch diese kleine Funktion zu senden, die ich zusammengeschmissen habe, aber es verwandelt alles in ein Gobbledegook ändert nichts.

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

Irgendwelche Ideen?

EDIT:

Damit komme ich jetzt zurecht, obwohl es kaum eine gute Lösung zu sein scheint:

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

Irgendwo in diesem Durcheinander werden die nicht unterbrechenden Leerzeichen aus der (den) HTML-Vorlage (n) als ISO-8859-1 codiert, sodass sie fälschlicherweise als "Â" -Zeichen angezeigt werden

Das wäre dann eine Kodierung nach UTF-8, nicht nach ISO-8859-1. Das nicht unterbrechende Leerzeichen ist Byte 0xA0 in ISO-8859-1; Bei UTF-8 wäre es 0xC2,0xA0, was, wenn Sie es (fälschlicherweise) als ISO-8859-1 ansehen, als " " ausgegeben wird. Dazu gehört ein nachfolgender nbsp, den Sie möglicherweise nicht bemerken. Wenn dieses Byte nicht vorhanden ist, hat etwas anderes Ihr Dokument beschädigt, und wir müssen weiter oben nachsehen, um herauszufinden, was passiert.

Was ist der reguläre Ausdruck, wie funktioniert das Templating? Es scheint irgendwo einen richtigen HTML-Parser zu geben, wenn Ihre   - Zeichenfolgen (korrekt) in U + 00A0-Leerzeichen umgewandelt werden. In diesem Fall können Sie Ihre Vorlage einfach direkt im DOM verarbeiten und sie mit der Codierung ASCII serialisieren, um Nicht-ASCII-Zeichen als Zeichenreferenzen beizubehalten. Das würde Sie auch davon abhalten, reguläre Post-Processing-Vorgänge im HTML-Code selbst durchzuführen, was immer ein höchst zweifelhaftes Geschäft ist.

Jedenfalls können Sie vorerst eine der folgenden Optionen zum <head> Ihres Dokuments hinzufügen und prüfen, ob es dadurch im Browser richtig angezeigt wird:

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

Wenn Sie dies getan haben, ist das verbleibende Problem die Schuld von ActivePDF.

325
bobince

Wenn jemand das gleiche Problem wie ich hatte und der Zeichensatz bereits korrekt war, mache einfach Folgendes:

  1. Kopieren Sie den gesamten Code in die HTML-Datei.
  2. Öffnen Sie den Editor (oder einen beliebigen Texteditor) und fügen Sie den Code ein.
  3. Gehe zu "Datei -> Speichern unter"
  4. Geben Sie Ihren Dateinamen "example.html" ein (Wählen Sie "Dateityp: Alle Dateien (.)")
  5. Wählen Sie Codierung als UTF-8
  6. Klicken Sie auf Speichern, und Sie können jetzt Ihre alte HTML-Datei löschen. Die Codierung sollte nun korrigiert sein
24
Low

Problem: Sogar ich war mit dem Problem konfrontiert, wohin wir '£' mit einem String in POST Anfrage an CRM System, aber wann Wir haben den GET-Aufruf von CRM aus ausgeführt, er hat '£' mit einigem Zeichenfolgeninhalt zurückgegeben. Wir haben also analysiert, dass '£' in - konvertiert wurde. '£'.

Analyse: Der Fehler, den wir nach Recherchen festgestellt haben, ist, dass wir in POST call HttpWebRequest gesetzt haben ContentType as "text/xml" in GET Call war es "text/xml; charset: utf-8".

Solution: Als Teil der Lösung haben wir charset: utf-8 in POST request aufgenommen und es funktioniert.

11