【问题标题】:Java passing environment variable automatically escapes special charactersJava 传递环境变量自动转义特殊字符
【发布时间】:2017-01-13 17:33:19
【问题描述】:

如果我通过 eclipse 中的运行配置将一些变量作为环境变量传递,那么它会自动转义特殊字符。我想为某些格式传递一些 '\n' 和 '\r' 字符,但是当我通过调试检查代码中的值时,它们会自动转换为 '\\n' 和 '\\r'。

String value= System.getenv("envPassed");
System.out.println("envPassed= "+value);

所以如果 envPassed 在运行配置中被指定为 'hi\n\rhello',那么它将被转换为 'hi\\n\\r' 并输出打印为

hi\n\rhello

而输出应该是

hi
hello

我们有办法让它发挥作用吗?

【问题讨论】:

  • 这似乎是“converted”一词的一种奇怪用法。据我所见,根本没有转换任何内容,您已将hi\n\rhello 作为变量定义插入并得到一个包含hi\n\rhello 的字符串。
  • 说真的!!,它甚至在这里也将我的双反斜杠转换为单反斜杠。我又添加了一个反斜杠以将其显示为 2 个斜杠
  • 输出应该打印为两行。它应该打印为hi\n\rhello。你提供了反斜杠,你得到了反斜杠。你得到的正是你提供的。没有转换。 Java 中唯一将这些转义序列转换为行终止字符的是 Java 编译器,当对字符串文字进行操作时,它不参与此过程。注意回车应该在换行之前。
  • 你倒退了。您期望您在运行配置中按字面输入的\n\r 成为真正的换行符,换句话说,您期望像在字符串文字中输入\n\r 时发生的转换一样。但是 Eclipse 对话框不是 Java 源代码。这样的转换不会发生。除了 Eclipse 的 ${name} 变量替换之外,您得到的正是您输入的内容。

标签: java eclipse jvm environment-variables


【解决方案1】:

\n\r 之类的序列只有在您输入记录此类行为时才会转换为控制字符,例如 Java 源代码中的 String 文字。

用于环境变量或字符串替换的 Eclipse 对话框不执行这种转换,而是传输输入的字符串。说明这一点的事实是,您的 Java 程序读取并打印环境变量的值会准确地打印您输入的内容。

这是 Java 调试器的一个特殊属性,可以在检查时显示 String 内容,就像等效的 Java 源代码文字一样。这是唯一发生转化的地方。

Eclipse 开发人员似乎无意为这些变量支持多行字符串。它们似乎主要针对路径字符串和类似内容。但是,我找到了一种方法,如何插入换行符。使用${system_property:line.separator},这将读取名为line.separator的Java系统属性,该属性位于list of always present system properties中。

【讨论】:

    【解决方案2】:

    您始终可以在操作字符串之前对其进行预处理...如果您想安全起见,可以使用一点正则表达式来确保这也始终有效:

    String value = System.getenv("MyEnv");
    if ( value != null ) {
        value.replaceAll("\\\\n(\\\\r)?", "\n" );
    }
    System.out.println( value );
    

    请注意,四个反斜杠不是错误 - 这是必要的,因为 String.replaceAll() 将模式字符串解释为字符串和正则表达式。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2020-12-19
      相关资源
      最近更新 更多