.NET DataSet.GetXml() - デフォルトのエンコーディングは何ですか?
-
18-09-2019 - |
質問
既存のアプリのSQLServer 2000年SPROCにXMLを渡し、入力パラメータのデータ・タイプは、テキストです。 XML)は(Dataset.GetXMLから誘導されます。しかし、私はそれがエンコーディングを指定していません注意してください。
したがって、ユーザーは、特に代わりにASCII 39(単一引用符)の(アポストロフィように見える)146をASCII、SPROCが失敗し、データセットに不適切な文字に潜入するときます。
一つのアプローチは、
とGetXMLメソッドの結果をプレフィックスすることです<?xml version="1.0" encoding="ISO-8859-1"?>
これは、この場合には動作しますが、何が(他の予期せぬ文字がポップアップ表示されている場合)のSPROCがクラッシュしないことを確認するために、より正確なアプローチでしょうか?
PS。私は、ユーザーがMS-Wordや類似のエディタにテキストを入力している疑いがある、とのコピー&アプリの入力フィールドに貼り付けます。私はおそらくちょうどクラッシュを防ぐために必要な、ユーザーがこのように作業を継続できるようにするとよいでしょう。
編集:私はたとえば、確認したり、いくつかの側面を否定する答えを探しています:
- タイトルどおり、いただきました!デフォルトのエンコーディングはどれもXMLで指定されていない場合は
?
- エンコードISO-8859-1が使用する権利1です
?
- これにくい英語圏でより多くの文字を網羅してしまうより良いエンコードがSPROCに誤差が生じさせる場合
?
- あなたは、標準のASCII(0のみ127まで)のためのアプリのUIレベルでのフィルタリング、および拡張ASCIIを許可しないだろう
?
- 他の関連する詳細情報
解決
DataSet.GetXml()
はstring
を返します。 .NETでは、文字列は内部的にUTF-16を使用してエンコードされたが、それはここでは本当に関係ありませんされます。
の文字列には<?xml encoding=...>
宣言がない理由は、のバイトストリームの。 NETの文字列は、それが(ユニコード)で明確に定義されたコードポイント・セマンティクスを持つテキストだけだ、バイトストリームではないので、それはそこに必要とされていません。
、UTF-8が想定される XMLパーサによってBOMが存在しない場合です。問題は、XMLパーサではないので、あなたのケースでは、しかし、それは(それがTEXT
列に保存されているとき、XMLは、SQL Serverによって解析されません)にも完全に無関係です。問題は、あなたのXMLは、いくつかのUnicode文字が含まれており、TEXT
は、非UnicodeのSQL型であるということです。
あなたはstring
メソッドを使用して、任意のエンコーディングにEncoding.GetBytes()
をエンコードすることができます。
他のヒント
私はあなたのアプローチがでWriteXmlの代わりGETXMLを使用するべきであると考えています。それはあなたがエンコーディングを指定できるようにする必要があります。
ただし、中間ストリームを介して記述する必要がありますのでご注意 - 場合の出力を直接文字列に、それは常にUTF-16を使用します。あなたはTEXT列を使用しているので、それがTEXTのために有効でない文字を許可します。