2010-03-09 12 views
5

Creo que este es un problema estándar que puede haberse preguntado antes, pero no pude obtener la respuesta exacta para publicar el problema.Manejo del carácter de nueva línea en la entrada entre Windows y Linux

El problema es que nuestro servidor se ejecuta en una caja de linux. Tenemos acceso al servidor a través del navegador en una caja de la ventana para introducir datos en el campo que se supone debe contener varias líneas que los usuarios pueden introducir pulsando la tecla Intro después de cada línea Abc Def GHI

Cuando este campo de entrada (este es un área de texto), se lee en la máquina de Linux, queremos dividir los datos en función del nuevo carácter de línea.

Tenía tres preguntas sobre esto.

  1. contiene los datos entrantes "\ r \ n" o "\ n"

  2. Si los datos entrantes contiene "\ r \ n", la propiedad Linux line.separator (propiedad vm) no funcionaría para mí, ya que diría "\ n" y, por lo tanto, puede dejar "/ r" en los datos.

  3. Si "\ r" queda en los datos, si abro el archivo en una máquina con Windows, ¿esto significará un carácter de nueva línea?

Finalmente, ¿alguien puede decirme la forma estándar de tratar este problema?

+0

Creo que esto depende del idioma que está utilizando (¿es el "área de texto" en una aplicación Java, página HTML u otra cosa?) Y posiblemente qué UI toolkit está usando. –

+0

Estamos utilizando una aplicación web basada en Java y es una página html. No se está utilizando ninguna otra herramienta de interfaz de usuario. – Fazal

Respuesta

3

Linux usa \n.
Windows usa \r\n.

Por lo tanto, a menos que hayas ajustado algo en Linux, debería venir en \n.

Usted podría regex cabo \r\n y \n y reemplazar con lo que usted quiere 3.

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

+0

Sí, estamos planeando hacerlo, pero me parece que este problema debería tener una solución más genérica incorporada en el lenguaje. Como los datos ingresados ​​en Windows y leídos en el servidor de Linux son muy comunes. Puede ser que esté sobrevalorando el poder del lenguaje, pero manejar esto en cada aplicación suena muy doloroso – Fazal

3

El método estándar java.io.DataInputStream y java.io.BufferedInputReader tanto manejar esto de forma automática a través de la readLine() evitar el problema. Realmente no debería usar DataInputStream para esto ya que no admite los juegos de caracteres correctamente y es readLine() ha quedado en desuso durante mucho tiempo.

Para la salida de texto, puede usar java.io.PrintWriter en el que está printLn(), y los métodos relacionados con los parámetros, muestra la secuencia de nueva línea correcta para la plataforma actual. java.io.BufferedWriter también maneja esto correctamente y proporciona un método public newLine().

0

Probablemente intente esto?

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

No es 100% seguro de la sintaxis, pero la idea básica de la expresión regular es: "cero o uno \ r, y exactamente un \ n". O bien, si solo quiere normalizar la entrada:

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

No me parece muy doloroso. ;-)

+0

Estoy de acuerdo. esto no es tan doloroso Pero no me gusta la idea básica de preocuparme por los nuevos caracteres de línea en el código de la aplicación cuando uso un lenguaje como Java que ha estado ahí por años suficientes para dar una mejor manera de resolver el problema:) ... Aunque por otro lado es el camino OS trata con newline de manera diferente la causa de preocupación que probablemente nunca tenga un buen comportamiento consistente para un futuro previsible. – Fazal

+0

No podría estar más de acuerdo con usted, pero aún así, esto es un problema inter-OS entre redes. HTTP exige el uso de "\ r \ n" para terminar líneas, pero todos los sistemas * nix usan "\ n" internamente. O bien, Windows usa la codificación little-endian de enteros/punteros, pero los protocolos de red requieren gran endianidad de los datos transmitidos. La verdad todavía está por ahí en algún lado. ;) Y mientras trabajamos con sistemas tan interconectados y diferentes, tenemos que manejar sus peculiaridades, desafortunadamente. – dimitarvp

-1

Gracias por la respuesta chicos ...Finalmente, mirando la sugerencia dada por Kevin, usamos el contenedor StringReader y BufferedReader para superar el problema. Usamos el lector de cadenas ya que los datos se leen como una cadena de la solicitud.

Con suerte esta pregunta ayuda a las personas en el futuro

+2

No publique respuestas a sus propias preguntas cuando no tenga nada que agregar. Eso es lo que los comentarios son para ... –

1

En lugar de utilizar expresiones regulares, también puede hacer que sea más sencillo de hacer algo así.

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"); 
    } 

Así que si su entorno local es ventanas, puede hacer que este trabajo a nivel local y también funcionará si está desplegando a un entornos basados ​​en Linux diferente.

Cuestiones relacionadas