Konvertierung von Unicode zu Windows-1251 mit XML (HTML) -Escaping

8

Ich habe XML-Datei und muss HTML-Datei mit Windows-1251-Codierung durch Anwenden von XSL-Transformation erstellen. Ein Problem besteht darin, dass Unicode-Zeichen der XSL-Datei nicht in HTML-Unicode-Escape-Sequenzen wie "& amp; # 1171;" während der XSL-Transformation nur "?" Zeichen wird anstelle von ihnen geschrieben. Wie kann ich die XslCompiledTransform.Transform-Methode dazu auffordern, diese Konvertierung durchzuführen? Oder gibt es eine Methode, um HTML-String in Windows-1251 HTML-Datei mit HTML-Unicode-Escape-Sequenzen zu schreiben, so dass ich XSL Transformation String ausführen und dann mit dieser Methode in eine Datei mit Windows-1251-Codierung und HTML schreiben können -Escape aller Unicode-Zeichen (etwa Convert (" ғ ") gibt " & amp; # 1171; ") zurück?

%Vor%

Danke allen für die Hilfe!

AKTUALISIEREN

Mein Ausgabekonfigurations-Tag in XSL-Datei:

%Vor%

Ich hoffe nicht einmal jetzt, dass XSL meine Bedürfnisse befriedigen wird. Aber ich wundere mich, dass ich keine Methode habe, um zu überprüfen, ob Zeichen durch die angegebene Kodierung akzeptabel ist. Etwas wie

%Vor%

Meine derzeitige Lösung besteht darin, alle Zeichen größer als 127 (c & gt; 127) in & amp; #dddd umzuwandeln; Escape Strings, aber mein Chef ist nicht zufrieden mit der Lösung, weil die Quelle der generierten HTML-Datei nicht lesbar ist.

    
meir 10.05.2011, 08:59
quelle

5 Antworten

1

Beachten Sie, dass XML sowohl ein Datenmodell als auch ein Serialisierungsformat ist. Die Daten können einen anderen Zeichensatz als die Serialisierung dieser Daten verwenden.

Der Hauptgrund für Ihr Problem scheint zu sein, dass Ihr Serialisierungsprozess versucht, den Zeichensatz des Datenmodells zu begrenzen, während Sie den Zeichensatz des Serialisierungsformats festlegen möchten. Nehmen wir ein Beispiel: <band>Motörhead</band> und <band>Mot&#246;rhead</band> sind gleich XML-Dokumente. Sie haben die gleiche Struktur und genau die gleichen Daten. Wegen des Heavy-Metal-Umlauts ist der Zeichensatz der Daten Unicode (oder etwas Größeres) als ASCII), aber da die Zeichenreferenz &#246; verwendet wird, ist der Zeichensatz der letzten Serialisierungsform des Dokuments ASCII. Um diese Daten verarbeiten zu können, müssen Ihre XML-Tools in beiden Fällen noch Unicode-fähig sein, aber wenn Sie die letztere Serialisierung verwenden, müssen die I / O- und Dateiübertragungs-Tools nicht Unicode-fähig sein.

Meine Vermutung ist, dass es in der Praxis versucht, den Zeichensatz der Daten auf die in Windows-1251 enthaltenen Zeichen zu beschränken, indem er der XMLTextWriter die Verwendung der Windows-1251-Codierung vorschreibt alle Zeichen außerhalb dieses Zeichensatzes und stattdessen ein Zeichen ? .

Da Sie jedoch Ihr XML-Dokument durch eine XSL-Transformation erzeugen, können Sie den Zeichensatz der Serialisierung direkt in Ihrem XSLT-Dokument steuern. Dazu fügen Sie dem xsl: output-Element ein Codierungsattribut hinzu. Ändere es so, dass es so aussieht

%Vor%

Nun kümmert sich der XSLT-Prozessor um die Serialisierung mit reduziertem Zeichensatz und gibt eine Zeichenreferenz für alle Zeichen in den Daten aus, die in Windows-1251 enthalten sind.

Wenn Sie den Zeichensatz der Daten wirklich ändern möchten, müssen Sie Ihre Daten mit einer geeigneten Zeichenkonvertierungsbibliothek verarbeiten, die das am besten geeignete Ersatzzeichen erraten kann (wie ö - & gt; o ) .

    
jasso 28.05.2011 12:27
quelle
0

versuchen Sie, Ihre xsl-Datei mit Ersatzregeln a la

zu ergänzen %Vor%

Sie können dies stattdessen mit Regex-Mustern tun:

%Vor%

Ihr Problem beginnt mit dem XML-Parser, der die numerische Entitätsreferenz durch die entsprechenden Unicode-Zeichen ersetzt, bevor die Umwandlung stattfindet. also die unbekannten Zeichen (bzw. '?')  in Ihrem konvertierten Dokument landen.

hoffe das hilft,

Beste Grüße,

carsten

    
collapsar 13.05.2011 13:25
quelle
0

Die richtige Lösung wäre, die Datei in eine Unicode-Kodierung (wie UTF-8) zu schreiben und CP-1251 und alle anderen Legacy-Kodierungen zu vergessen.

Aber ich werde annehmen, dass dies aus irgendeinem Grund keine Option ist.

Die beste Alternative, die ich mir ausdenken kann, besteht darin, die Zeichenersetzung in der Zeichenfolge vorzunehmen, bevor Sie sie an den XmlReader übergeben. Sie sollten die Encoding-Klasse verwenden, um die Zeichenfolge in ein Array von Bytes in CP-1251 zu konvertieren und einen eigenen Decoder-Fallback-Mechanismus zu erstellen. Der Fallback-Mechanismus kann dann die XML-Escape-Sequenzen einfügen. Auf diese Weise werden Sie garantiert nicht mit allen (und genau diesen) Zeichen umgehen, die nicht in CP-1251 enthalten sind.

Dann können Sie das Array von Bytes (in CP-1251) in einen normalen .NET String (in UTF-16) konvertieren und an Ihren XmlReader übergeben. Die Werte, die maskiert werden müssen, werden bereits maskiert, sodass die letzte Datei korrekt geschrieben werden sollte.

AKTUALISIEREN

Ich habe gerade den Fehler dieser Methode erkannt. Der XmlWriter wird weiter aus dem & amp; Zeichen als &amp; , so dass die Escape-Zeichen selbst im endgültigen Dokument und nicht in den Zeichen erscheinen, die sie darstellen.

Dies kann eine sehr komplizierte Lösung erfordern!

EIN WEITERES UPDATE

Ignoriere das letzte Update. Da Sie die Zeichenfolge als XML lesen, sollten die Escapezeichen korrekt interpretiert werden. Das ist, was ich bekomme, um Post schnell zu versuchen, anstatt das Problem durch zu denken!

Meine vorgeschlagene Lösung sollte gut funktionieren.

    
Jeffrey L Whitledge 13.05.2011 13:53
quelle
0

Haben Sie versucht, die Codierung in der Datei xsl: output anzugeben? ( Ссылка )

    
Mihai Nita 28.05.2011 09:20
quelle
0

Der sicherste und interoperabelste Weg ist die Angabe von encoding="us-ascii" in Ihrem xsl: output-Element. Die meisten XSLT-Prozessoren unterstützen das Schreiben dieser Codierung.

US-ASCII ist eine vollkommen sichere Kodierung, da es eine kompatible Teilmenge von UTF-8 ist (Sie können das emittierte XML mit einer "utf-8" Kodierung versehen, da dies auch zutrifft: dies kann sein Durch Angabe von omit-xml-declaration="yes" für Ihre xsl: output-Datei und das manuelle Voranstellen einer Deklaration "& lt; x xml version = '1.0' encoding = 'utf-8'? & gt;" an Ihre Ausgabe.

Dieser Ansatz funktioniert, da bei Verwendung der US-ASCII-Codierung ein Serializer gezwungen ist, den XML-Escaping-Mechanismus für Zeichen jenseits von U + 007F zu verwenden und diese somit als numerische Zeichenreferenzen (die & amp; # ; "Form".

Wenn es sich um Umgebungen handelt, in denen nicht-standardisierte Kodierungen erforderlich sind, ist es im Allgemeinen eine gute defensive Technik, um diese Art von XML zu erzeugen, da es vollständig konform ist und in der Praxis sogar mit einiger fehleranfälliger Software funktioniert.

    
alexbrn 29.05.2011 04:40
quelle

Tags und Links