Question

application existante passe XML à une procédure stockée dans SQL Server 2000, le paramètre d'entrée de type de données est de textes; Le XML est dérivé de Dataset.GetXML (). Mais je remarque qu'il ne spécifie pas un codage.

Ainsi, lorsque l'utilisateur se faufile dans un caractère inapproprié dans l'ensemble de données, en particulier ASCII 146 (qui semble être une apostrophe) au lieu de 39 ASCII (guillemet simple), le sproc échoue.

Une approche consiste à préfixer le résultat de GetXML avec

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

Il fonctionne dans ce cas, mais ce serait une approche plus correcte pour assurer la sproc ne tombe pas en panne (si d'autres personnages imprévus pop-up)?

PS. Je soupçonne que l'utilisateur est en train de taper du texte dans MS-Word ou un éditeur similaire, et copier et coller dans les champs d'entrée de l'application; Je voudrais probablement permettre à l'utilisateur de continuer à travailler de cette façon, il faut juste éviter les accidents.

EDIT: Je suis à la recherche des réponses que confirmer ou d'infirmer quelques aspects, par exemple:
- selon le titre, ce qui est l'encodage par défaut si aucun spécifié dans le XML
- L'encodage ISO-8859-1 celui droit d'utiliser
? - s'il y a un meilleur encodage qui engloberait plus de caractères dans le monde anglophone et donc moins susceptibles de causer une erreur dans le sproc
? - vous souhaitez filtrer au niveau de l'interface utilisateur pour ASCII standard de l'application (0 à 127 seulement), et ne pas laisser ASCII étendu
? -. Tout autre détail pertinent

Était-ce utile?

La solution

DataSet.GetXml() retourne un string. Dans .NET, les chaînes sont encodées en utilisant UTF-16, mais ce n'est pas vraiment pertinent ici.

La raison pour laquelle il n'y a pas de déclaration <?xml encoding=...> dans la chaîne est parce que cette déclaration n'est utile ou nécessaire pour analyser XML dans un flux d'octets . Une chaîne .NET n'est pas un flux d'octets, il est juste texte avec la sémantique de codepoint bien définies (qui est Unicode), il est donc pas nécessaire là.

S'il n'y a pas de déclaration de codage XML, UTF-8 est à supposer par l'analyseur XML en l'absence de nomenclature. Dans votre cas, cependant, il est également tout à fait hors de propos, car le problème est pas avec un analyseur XML (XML n'est pas analysé par SQL Server quand il est stocké dans une colonne de TEXT). Le problème est que votre XML contient des caractères Unicode et TEXT est un type SQL non-Unicode.

Vous pouvez encoder un string à tout codage en utilisant la méthode Encoding.GetBytes().

Autres conseils

Je crois que votre approche devrait être d'utiliser WriteXml au lieu de GetXml. Cela devrait vous permettre de spécifier l'encodage.

Cependant, notez que vous devrez écrire dans un flux intermédiaire - si vous sortie directement à une chaîne, il sera toujours utiliser UTF-16. Puisque vous utilisez une colonne TEXT, qui permettra des caractères non valides pour le texte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top