0

Java クラスに渡されたコマンド ライン引数が自動的にエスケープされているように見えるのに、インスタンス化された String オブジェクトではエスケープ文字 () が無視されているように見えるのはなぜですか。

たとえば、次のような文字列で開始する場合:

SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

そして、次のような単純なクラスで実行してみます。

public class EscapeTest {
    public static void main (String[] args) {
        String str = "SELECT * FROM my_table WHERE " 
                     + "my_col like 'ABC_\' ESCAPE '\'";
        System.out.println("ARGS[0]: "+args[0]);
        System.out.println("STR: "+str);
}
}

上記の「SELECT」ステートメントをコマンドライン引数として渡すと、次のような出力が得られます。

ARGS[0]: SELECT * FROM my_table WHERE my_col like 'ABC_\' ESCAPE '\'

STR: SELECT * FROM my_table WHERE my_col like 'ABC_' ESCAPE ''

Eclipse デバッガーで ARGS[0] の値を見ると、スラッシュがエスケープされていることがわかります。なぜこれが起こるのですか?予想するのはちょっと難しいと思います。

4

1 に答える 1

2

文字列の内容にstrバックスラッシュが含まれていません。これらは、Java 文字列リテラルのエスケープ シーケンスを理解する Java コンパイラによって処理されます。

コマンド ライン プロセッサはおそらくそれを行っていません。バックスラッシュを特別に扱っているわけではありませんが、これはシェルによって異なります。(ほとんどの Unix シェルで、バックスラッシュの扱いが異なります。Windows を使用していると思います。)

そのため、コマンド ライン引数にはバックスラッシュが含まれています。バックスラッシュは、実行中の Java プロセスによってエスケープされていません。文字列内に「そこ」にあるだけです。

タブや改行などを表示できるように、デバッガーが文字列を表示するときに文字列をエスケープしているように聞こえます。これは、デバッガーが文字列を表示する方法にすぎないことを理解することが重要です。Java 文字列自体には「エスケープ」のようなものはありません。

編集:コメントによると:

この文字列を Java ソース コードで表現するには、バックスラッシュをエスケープする必要があります。

String str = "SELECT * FROM my_table WHERE my_col like 'ABC_\\' ESCAPE '\\'"; 

バックスラッシュは Java 文字列リテラルのエスケープ文字であるため、バックスラッシュをエスケープする必要があります。

于 2011-07-22T19:16:26.293 に答える