Pregunta

aplicación existente pasa XML a un sproc en SQLServer 2000, entrada de parámetros de tipo de datos es texto; El XML se deriva de Dataset.GetXML (). Pero noto que no especifica una codificación.

Así que cuando el usuario se cuela en un carácter apropiado en el conjunto de datos, ASCII específicamente 146 (que parece ser un apóstrofe) en lugar de ASCII 39 (comilla simple), el procedimiento almacenado falla.

Un enfoque consiste en prefijar el resultado de GetXml con

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

Se trabaja en este caso, pero lo que sería un enfoque más correcto para asegurar la sproc no se cuelga (si otros personajes imprevistos pop-up)?

PS. Sospecho que el usuario está escribiendo texto en MS-Word o un editor similar y copiar y pegar en los campos de entrada de la aplicación; Yo probablemente desee permitir al usuario continuar trabajando de esta manera, sólo hay que prevenir los accidentes.

EDIT: Estoy buscando respuestas que confirman o niegan algunos aspectos, por ejemplo:
- según título, cuál es la codificación por defecto si no se especifica ninguno en el XML
- ¿Es la codificación ISO-8859-1 el derecho a utilizar
? - si hay una mejor codificación que abarcaría más caracteres en el mundo de habla Inglés y por lo tanto menos propensos a causar un error en el procedimiento almacenado
? - le filtrar a nivel de interfaz de usuario de la aplicación para ASCII estándar (0 a 127 solamente), y no permitir ASCII extendido
? -. Cualquier otro detalle pertinente

¿Fue útil?

Solución

DataSet.GetXml() devuelve un string. En .NET, las cadenas se codifican internamente con UTF-16, pero que no es realmente relevante aquí.

La razón por la que no hay declaración <?xml encoding=...> en la cadena se debe a que la declaración sólo es útil o necesario para analizar XML en un flujo de bytes . Una cadena .NET no es un flujo de bytes, es sólo de texto con la semántica codepoint bien definidas (que es Unicode), por lo que no se necesita allí.

Si no hay una declaración de codificación XML, UTF-8 es de suponer por el analizador XML en ausencia de lista de materiales. En su caso, sin embargo, también es completamente irrelevante ya que el problema no es con un analizador XML (XML no se analiza por SQL Server cuando se almacena en una columna TEXT). El problema es que el código XML contiene algunos caracteres Unicode y TEXT es un Unicode no de tipo SQL.

Puede codificar un string a cualquier codificación usando el método Encoding.GetBytes().

Otros consejos

Creo que su enfoque debe ser el uso de WriteXml en lugar de GetXml. Eso debería permitirle especificar la codificación.

Sin embargo, tenga en cuenta que tendrá que escribir a través de una corriente intermedia - si se impriman directamente en la cadena, se utilizará siempre UTF-16. Puesto que usted está utilizando una columna de texto, que permitirá caracteres no válidos para el texto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top