Frage

Vorhandene App übergibt XML an einen Sproc in SQLServer 2000, der Datentyp des Eingabeparameters ist TEXT;Das XML wird von Dataset.GetXML() abgeleitet.Aber mir ist aufgefallen, dass keine Kodierung angegeben ist.

Wenn der Benutzer also ein unpassendes Zeichen in den Datensatz einfügt, insbesondere ASCII 146 (was wie ein Apostroph aussieht) anstelle von ASCII 39 (einfaches Anführungszeichen), schlägt der Sproc fehl.

Ein Ansatz besteht darin, dem Ergebnis von GetXML ein Präfix voranzustellen

<?xml version="1.0" encoding="ISO-8859-1"?>

In diesem Fall funktioniert es, aber was wäre ein korrekterer Ansatz, um sicherzustellen, dass der Sproc nicht abstürzt (wenn andere unvorhergesehene Zeichen auftauchen)?

PS.Ich vermute, dass der Benutzer Text in MS-Word oder einen ähnlichen Editor eingibt und ihn kopiert und in die Eingabefelder der App einfügt.Ich möchte dem Benutzer wahrscheinlich erlauben, auf diese Weise weiterzuarbeiten, nur um Abstürze zu verhindern.

BEARBEITEN:Ich suche nach Antworten, die einige Aspekte bestätigen oder dementieren, zum Beispiel:
- Was ist laut Titel die Standardkodierung, wenn im XML keine angegeben ist?
- Ist die Kodierung ISO-8859-1 die richtige?
- Wenn es eine bessere Kodierung gäbe, die mehr Zeichen im englischsprachigen Raum umfassen würde und daher weniger wahrscheinlich einen Fehler im Sproc verursachen würde?
- Würden Sie auf der Benutzeroberflächenebene der App nach Standard-ASCII (nur 0 bis 127) filtern und kein erweitertes ASCII zulassen?
- alle anderen relevanten Details.

War es hilfreich?

Lösung

DataSet.GetXml() gibt a zurück string.In .NET werden Zeichenfolgen intern mit UTF-16 codiert, aber das ist hier nicht wirklich relevant.

Der Grund, warum es nein gibt <?xml encoding=...> Die Deklaration in der Zeichenfolge liegt daran, dass diese Deklaration nur zum Parsen von XML in a nützlich oder erforderlich ist Byte-Stream.Eine .NET-Zeichenfolge ist kein Bytestream, sondern lediglich Text mit einer genau definierten Codepunktsemantik (Unicode), daher wird sie dort nicht benötigt.

Wenn keine XML-Kodierungsdeklaration vorliegt, ist UTF-8 anzunehmen durch den XML-Parser in Ermangelung einer Stückliste.In Ihrem Fall ist es jedoch auch völlig irrelevant, da das Problem nicht bei einem XML-Parser liegt (XML wird von SQL Server nicht analysiert, wenn es in einem gespeichert wird). TEXT Spalte).Das Problem besteht darin, dass Ihr XML einige Unicode-Zeichen enthält und TEXT ist ein Nicht-Unicode-SQL-Typ.

Sie können a kodieren string zu jeder Codierung mit Encoding.GetBytes() Methode.

Andere Tipps

Ich glaube, Ihr Ansatz sollte darin bestehen, WriteXml anstelle von GetXml zu verwenden.Damit sollten Sie die Codierung festlegen können.

Beachten Sie jedoch, dass Sie über einen Zwischenstream schreiben müssen. Wenn Sie direkt in einen String ausgeben, wird immer UTF-16 verwendet.Da Sie eine TEXT-Spalte verwenden, sind Zeichen zulässig, die für TEXT nicht gültig sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top