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 编译器处理的。

命令行处理器可能没有这样做——它没有以任何方式特别对待反斜杠,尽管这取决于你的 shell。(在大多数 Unix shell 中,它以不同的方式处理反斜杠。我猜你在 Windows 上。)

因此,您的命令行参数确实包含反斜杠。它们没有被执行的 Java 进程转义 - 它们只是字符串中的“那里”。

现在听起来调试器在向您显示字符串时正在转义字符串,以便您可以看到制表符和换行符之类的内容。重要的是要理解这只是调试器显示字符串的方式——在 Java 字符串本身中没有“转义”这样的东西。

编辑:根据评论:

要在 Java 源代码中表达此字符串,您必须转义反斜杠:

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

反斜杠必须转义,因为反斜杠是 Java 字符串文字中的转义字符。

于 2011-07-22T19:16:26.293 回答