命令行参数(Java)中的转义序列

时间:2019-05-18 00:50:37

标签: java arrays command-line-arguments

根据How to use line break argument

  

在Java中将字符串定义为“ Hello \ nHello”时,它不包含“ \”   字符。这是换行符的转义序列:“ \ n”只是   一个字符。

     

使用此字符串作为您的参数时   程序,但是(因此字符串在外部定义),“ \ n”为   解释为两个字符:“ \”和“ n”。

为什么也不能编译包含转义序列的命令行参数?我以为命令行参数被放置在数组String [] args中?

并且String [] args将包含args [0] =“ Hello \ nJava”;

2 个答案:

答案 0 :(得分:3)

命令行参数不是Java源代码,因此Java源代码中字符含义的规则不适用。

命令行参数的解释或其他内容是命令解释器的范围; Java没有被特别对待。例如,在大多数(所有?)Linux Shell中,\ n都不能用引号引起来:

render() {
    const cols = items.map( (item, idx) => ( 

       <Col key={item} lg={3}>
            ....
       <Col>
       );
       
    const noRows =  Math.ceil(items.length / 4);

    const rows = Array.from(Array(noRows)).map((n, i) =>(
      <Row>
       {cols.slice(i* 4, (i + 1)* 4)}
      </Row>
    ));

    return rows;
}

在引号之外,反斜杠-n表示“字面意义上的n”,与“ n”相同,因为“ n”在外壳上没有任何特殊之处。

  $ echo 'a \n b'
  a \n b

当然,Java系统可以在命令解释器之后应用其自己的处理程序,但是大多数Linux用户会感到困惑。与其他命令相比,Java命令的行为会不一致。

答案 1 :(得分:0)

转义的序列没有被命令shell转换为它们相应的字符代码(How can I echo a newline in a batch file?),所以您想知道为什么java程序在调用时不对接收到的参数做一些按摩处理它。好吧,原因很简单:按摩是任意,也许某些用户并不期望将字符串解释为人类文本。但是一个代表其他事物的字符串,其中转义代码的任意转换是失败的概括。一些例子:

  1. 这些字符串是Windows文件路径,例如c:\my\folder\number\n,在那里您可以找到两个\n,如果将Java随意地归纳为人类文本将是一个重大错误。
  2. ids,密码,ASCII艺术,
  3. 可序列化内容(如xml,模型对象,专有内容等)的结构化表示形式。

现在,如果您定义了将要编译的字符串 INSIDE java代码,则在编译之后,所有\?都将被编译为它们相应的转义代码(该语言的功能) );但是您可以通过转义转义符\\?来告诉Java编译器不要执行此操作;但是这个编译问题。在运行时,所有字符串只不过是char[],并且不会对它们进行任意按摩。

Check the JLS:

  

如果转义中反斜杠后的字符不是ASCII b,t,n,f,r,“,',\,0、1、2、3、4、5,则这是编译时错误,6或7。Unicode转义\ u会被更早处理(第3.3节)。