1

既存のアプリは XML を SQLServer 2000 の sproc に渡します。入力パラメーターのデータ型は TEXT です。XML は Dataset.GetXML() から派生します。しかし、エンコーディングが指定されていないことに気付きました。

そのため、ユーザーが不適切な文字、具体的には ASCII 39 (一重引用符) ではなく ASCII 146 (アポストロフィのように見える) をデータセットに忍び込ませると、sproc は失敗します。

1 つの方法は、GetXML の結果に接頭辞を付けることです。

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

この場合は機能しますが、sproc がクラッシュしないようにするためのより正しいアプローチは何でしょうか (他の予期しない文字がポップアップした場合)。

PS。ユーザーが MS-Word または同様のエディターにテキストを入力し、コピーしてアプリの入力フィールドに貼り付けていると思われます。クラッシュを防ぐ必要があるだけで、ユーザーがこの方法で作業を続けられるようにしたいと思うでしょう。

編集:いくつかの側面を確認または拒否する回答を探しています。たとえば、
-タイトルごとに、XMLで指定されていない場合のデフォルトのエンコーディングは何ですか?
- エンコーディング ISO-8859-1 は使用するのに適切ですか?
- 英語圏でより多くの文字を含み、sproc でエラーが発生する可能性が低い、より優れたエンコーディングがある場合は?
- アプリの UI レベルで標準 ASCII (0 ~ 127 のみ) をフィルター処理し、拡張 ASCII を許可しませんか?
- その他の関連する詳細。

4

2 に答える 2

0

あなたのアプローチは、GetXml の代わりに WriteXml を使用するべきだと思います。これにより、エンコーディングを指定できるようになります。

ただし、中間ストリームを介して書き込む必要があることに注意してください。文字列に直接出力する場合、常に UTF-16 が使用されます。TEXT 列を使用しているため、TEXT に無効な文字が許可されます。

于 2009-12-09T19:06:57.277 に答える
0

DataSet.GetXml()を返しますstring。.NET では、文字列は UTF-16 を使用して内部的にエンコードされますが、ここではあまり関係ありません。

文字列に宣言がない理由<?xml encoding=...>は、その宣言が有用であるか、バイト ストリームで XML を解析するためにのみ必要であるためです。.NET 文字列はバイト ストリームではなく、明確に定義されたコードポイント セマンティクス (Unicode) を持つ単なるテキストであるため、そこでは必要ありません。

XML エンコーディング宣言がない場合、BOM がない場合、XML パーサーは UTF-8 を想定します。ただし、あなたの場合、問題は XML パーサーにはないため、まったく無関係です (XML がTEXT列に格納されている場合、XML は SQL Server によって解析されません)。問題は、XML に一部の Unicode 文字が含まれておりTEXT、非 Unicode SQL タイプであることです。

メソッドstringを使用して任意のエンコーディングにエンコードできます。Encoding.GetBytes()

于 2009-12-09T23:34:51.057 に答える