Domanda

applicazione esistente passa XML a uno sProc in SQLServer 2000 ingresso tipo di dati del parametro è TESTO; L'XML è derivato da Dataset.GetXML (). Ma mi accorgo che non specifica una codifica.

Così, quando l'utente si intrufola in un personaggio inadeguato nel set di dati, in particolare 146 ASCII (che sembra essere un apostrofo), invece di ASCII 39 (singolo apice), lo sproc fallisce.

Un approccio è quello anteporre il risultato di GetXml con

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

Funziona in questo caso, ma quello che sarebbe un approccio più corretto per garantire la sProc non va in crash (se altri personaggi imprevisti pop-up)?

PS. Ho il sospetto che l'utente sta scrivendo il testo in MS-Word o un editor simile, e copiare e incollare nei campi di immissione della app; Io probabilmente voler consentire all'utente di continuare a lavorare in questo modo, solo bisogno di evitare che il crash.

EDIT: Sto cercando risposte che confermare o smentire alcuni aspetti, per esempio:
-? Come da titolo, che cosa è la codifica di default se non specificato nel XML
- è la codifica ISO-8859-1 quella giusta da usare
? - se c'è una codifica migliore che comprenda più personaggi nel mondo di lingua inglese e quindi meno probabilità di causare un errore nel sproc
? - si dovrebbe filtrare a livello di interfaccia utente dell'applicazione per ASCII standard (da 0 a solo 127), e non permettere ASCII esteso
? -. Tutte le altre informazioni pertinenti

È stato utile?

Soluzione

DataSet.GetXml() restituisce un string. In .NET, le stringhe sono codificate internamente con UTF-16, ma che non è davvero rilevante qui.

Il motivo per cui non c'è nessuna dichiarazione <?xml encoding=...> nella stringa è dovuto al fatto che la dichiarazione è solo utile o necessaria per analizzare XML in un flusso di byte . Una stringa .NET non è un flusso di byte, è solo testo con la semantica codepoint ben definiti (che è Unicode), quindi non è necessario qui.

Se non v'è alcuna dichiarazione di codifica XML, UTF-8 è da assumere dal parser XML in assenza di BOM. Nel tuo caso, però, è anche del tutto irrilevante dal momento che il problema non è con un parser XML (XML non viene analizzato da SQL Server quando viene memorizzato in una colonna TEXT). Il problema è che il vostro XML contiene alcuni caratteri Unicode, e TEXT è un non-Unicode di tipo SQL.

È possibile codificare un string a qualsiasi codifica utilizzando il metodo Encoding.GetBytes().

Altri suggerimenti

Credo che il tuo approccio deve essere quello di utilizzare WriteXml invece di GetXml. Questo dovrebbe permettere di specificare la codifica.

Si noti tuttavia che si dovrà scrivere attraverso un flusso intermedio - se l'output direttamente in una stringa, sarà sempre usare UTF-16. Dal momento che si sta utilizzando una colonna di testo, che permetterà caratteri non validi per il testo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top