2011-07-27 50 views
4

NgMのおかげで、.NET 3.5でStringBuilderを使用して特殊文字を見つけ出してエスケープしています。しかし、私はToStringメソッドを使用すると、エスケープ文字をエスケープして、前の演習を役に立たなくします。誰かがそれを回避する方法を知っていますか?ここでStringBuilderのToStringメソッドが文字列のエスケープ文字をエスケープしないようにするにはどうすればよいですか?

はコードです:ここでは

private String ParseAndEscapeSpecialChars(String input) 
    { 
     StringBuilder sBuilder = new StringBuilder(input); 
     String output; 
     String specialChars = @"([-\]\[<>\?\*\\\""/\|\~\(\)\#/=><+\%&\^\'])"; 
     Regex expression = new Regex(specialChars); 

     if (expression.IsMatch(input)) 
     { 
      sBuilder.Replace(@"\", @"\\"); 
      sBuilder.Replace(@"'", @"\'");     
     } 

     output = sBuilder.ToString(); 
     return output; 
    } 

は、デバッグの結果は以下のとおりです。

input  "005 - SomeCompany's/OtherCompany's Support Center" 
sBuilder {005 - SomeCompany\'s/OtherCompany\'s Support Center} 
output  "005 - SomeCompany\\'s/OtherCompany\\'s Support Center" 
+0

また、@ sBuilder.ToString()も試してみましたが、同じ問題がありました。 – mattg

+0

この出力はどこにありますか?コンソール? Winformsラベル?デバッガ? – blowdart

+0

コードを見ると、出力に... \\ '...のようなパターンはありません。デバッガの出力を見て、プレゼンテーション目的でスラッシュをエスケープするチャンスはありますか? 'Console.Write(output)'? –

答えて

6

StringBuilderは文字をエスケープしません。それは何も特別または巧妙です。デバッガでちょうどこれを見ているドーナツまでのドル(にはエスケープされたバージョンが表示されます)。

+0

情報をありがとう、正常に動作しているようだ、ちょうどデバッグエスケープ文字を追加しています。私はSQLクエリを構築するために文字列を使用しています。私はエスケープするためにSQLで動作するものを見つける必要があると思います。 ' – mattg

+1

@mattg:いいえ、そうではありません。最初にSQLに値を入れてはいけません。代わりにパラメータ化されたクエリを使用してください。エスケープする必要は全くなく、SQLインジェクション攻撃についても心配する必要はありません。 –

3

あなたの結果はデバッグからだと言います。デバッガ自体を意味する場合は、変数の上にカーソルを置いて文字列の内容を調べるか、それをVSのウォッチリストに置くと、デバッガのディスプレイはウィンドウ/ツールチップのスラッシュをエスケープします。しかし、実際にコード内に文字列を出力すると、そこにエスケープがないことがわかります。それはデバッガの「機能」です。

System.Diagnostics.Debug.Writeline(myOutputVariable); 

を試してみて、「本物」の内容を確認するために、出力ウィンドウに見えます。

関連する問題