2010-03-09 25 views
5

我認爲這是一個標準問題,以前可能已經問過這個問題,但我無法得到確切的答案,所以發佈問題。在Windows和Linux之間處理輸入中的換行符

問題是我們的服務器運行在Linux機器上。我們訪問該服務器在瀏覽器上的窗口框輸入數據到這是應該包含多個線,用戶可以通過按每一行 美國廣播公司 防守 GHI

回車鍵後在此輸入字段(輸入字段這是一個文本區域),在linux機器上讀取,我們要根據新行字符拆分數據。

我對此有三個問題。

  1. 是否輸入數據包含爲 「\ r \ n」 或 「\ n」 個

  2. 如果輸入數據不包含 「\ r \ n」 個,在linux line.separator屬性(VM屬性)對我來說不會像「\ n」那樣工作,因此可能會在數據中留下「\ r」。

  3. 如果在數據中留下「\ r」,如果我在Windows機器上打開文件,這是否意味着換行符?

終於有誰能告訴我解決這個問題的標準方法?

+0

我認爲這取決於您使用的是什麼語言(是Java應用程序,HTML頁面或其他內容中的「文本區域」),以及可能使用的是什麼UI工具包。 – 2010-03-09 00:32:02

+0

我們使用基於java的web應用程序及其html頁面。沒有其他UI工具包正在使用 – Fazal 2010-03-09 04:59:57

回答

3

Linux使用\n
Windows使用\r\n

因此,除非你在linux中調整了一些東西,否則它應該在\n

你可以從正則表達式和\r\n\n用任何你想避免的問題3.

http://en.wikipedia.org/wiki/Newline

+0

是的,我們正計劃這樣做,但在我看來,這個問題應該有一個更通用的修復語言。由於數據在Windows上輸入並在Linux服務器上讀取是非常普遍的。可能是我過分的語言能力,但在每個應用程序中處理這聽起來非常痛苦 – Fazal 2010-03-09 04:54:26

3

標準java.io.DataInputStreamjava.io.BufferedInputReader均通過的readLine自動處理()方法來代替。你真的不應該使用DataInputStream,因爲它不能正確地支持字符集,並且它的readLine()已經被棄用很長一段時間了。

對於文本輸出,您可以使用其中包含printLn()的java.io.PrintWriter以及帶參數的相關方法輸出當前平臺的正確換行順序。 java.io.BufferedWriter也正確處理這個問題,並提供了一個public newLine()方法。

0

大概試試這個?

String[] lines = inputString.split("\r?\n"); 

不是100%確定的語法,但正則表達式的基本思想是:「零或一個\ r,正好一個\ n」。或者,如果你只是想正常化輸入:

inputString = inputString.replace("\r?\n", "\n"); 

對我來說這似乎不是很痛苦。 ;-)

+0

我同意。這不是很痛苦。但是我不喜歡使用像Java這樣的語言在應用程序代碼中擔心新行字符的基本概念,這種語言在那裏已經有足夠多的時間來給出一種更好的方法來解決問題:)......儘管另一方面它的方式OS對換行符的處理方式不同,可能永遠不會對可預見的未來有一個好的一致行爲 – Fazal 2010-03-09 23:14:14

+0

我完全同意你的看法,但這仍然是操作系統間,網絡間的問題。 HTTP要求使用「\ r \ n」來終止行,但所有* nix系統在內部使用「\ n」。或者,Windows使用整數/指針的小端編碼,但是網絡協議需要傳輸數據的大端。事實仍然存在。 ;)當我們處理這種相互關聯和不同的系統時,不幸的是我們必須處理他們的怪癖。 – dimitarvp 2010-03-10 08:18:44

-1

感謝您的迴應傢伙..最後看看Kevin給出的建議,我們使用StringReader和BufferedReader封裝來解決這個問題。我們使用字符串閱讀器,因爲數據是從請求中讀取的字符串。

希望這個問題能幫助人們在未來

+2

當您無需添加任何內容時,請不要在您自己的問題上發佈答案。這是什麼意見... – 2010-03-09 17:30:20

1

而不是使用正則表達式,你也可以將其簡單的做這樣的事情。

StringBuilder sb=new StringBuilder(); 
// append your texts here and to go to a new line use 
    if(System.getProperty("os.name").startsWith("Windows")){ 

       sb.insert("\r\n"); 
      } 
      else { 
      sb.insert("\n"); 
    } 

所以,如果你的本地環境是Windows,你也可以讓當地的工作,也將工作,如果你要部署到不同的基於Linux的環境。

相關問題