2017-01-13 75 views
-1

如果我通過eclipse中的運行配置傳遞一些變量作爲envirin變量,那麼它會自動轉義特殊字符。我想爲某些格式傳遞一些'\ n'和'\ r'字符,但是當我通過調試來檢查代碼中的值時,它們會自動轉換爲'\\ n'和'\\ r'。Java傳遞環境變量自動轉義特殊字符

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

所以如果envPassed被給定爲 '喜\ n \ rhello' 在運行構型中,然後將它轉換爲 '喜\\ñ\\ r' 和輸出打印爲

hi\n\rhello 

而輸出應該是

hi 
hello 

我們有辦法讓它工作嗎?

+1

這似乎是「轉換」一詞的一個奇怪用法。據我所見,根本沒有任何轉換,你已經將'hi \ n \ rhello'作爲變量定義插入,並得到一個包含'hi \ n \ rhello'的字符串。 – Holger

+0

嚴重!!,它甚至在這裏也將我的雙反斜槓轉換爲單個。我添加了一個更多的反斜槓,將其顯示爲2個斜槓 – sunder

+1

輸出應該*不打印爲兩行。它應該打印爲「hi \ n \ rhello」。你提供了反斜槓,你有反斜槓。你回到了你所提供的。沒有轉換。在Java中,將這些轉義序列轉換爲行終止字符的唯一方法是使用字符串文字進行操作的Java編譯器,並且不涉及此過程。注意回車應該在換行之前。 – EJP

回答

2

\n\r這樣的序列只有在您記錄此類行爲時輸入它們時纔會轉換爲控制字符,例如Java源代碼中的String文字。

用於環境變量或字符串替換的Eclipse對話框不會執行此類轉換,而是按輸入的方式傳輸字符串。這可以通過您的Java程序讀取並打印環境變量的值打印出您輸入的內容來說明。

這是Java調試器的一個特殊屬性,用於在檢查時顯示String內容,例如等效的Java源代碼文字。這是轉換髮生的唯一地方。

似乎並沒有Eclipse開發人員打算爲這些變量支持多行字符串。他們似乎主要瞄準路徑字符串等。不過,我找到了一種方法,你如何插入換行符。使用${system_property:line.separator},這將讀取位於list of always present system properties中的名爲line.separator的Java系統屬性。

-1

你總是可以操縱它之前預處理串...如果你想成爲安全,你可以使用正則表達式的一點點,以確保這將一直工作過:

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

請注意這四個反斜槓並不是一個錯誤 - 這是必要的,因爲String.replaceAll()將模式字符串解釋爲字符串和正則表達式。

希望這會有所幫助!