Enconding compatible con Windows

7 views
Skip to first unread message

Matias Mascazzini

unread,
Sep 22, 2016, 4:54:06 PM9/22/16
to rubysur
Hola Rubistas,
tengo una pequeña app. web hecha en Cuba que me genera un archivo TXT en linux todo bien, pero en Windows se ve distinto por el Salto de Linea.

La consulta es ¿Cómo se define el encoding de salida? y ¿cual es el encoding correcto de los windows XP y Win 7.

El código que crea el archivo es:

def crear_archivo_issunne(lineas)
    #//Fija la ruta del archivo de salida.
    path = "./tmp/archivo_matias.txt"
   
    #//Crear archivo
    File.open(path, 'w') do |salida|
      lineas.each do |linea|
        salida.puts linea
      end
    end
    path
  end

Las lineas las genero concatenando unas cadenas.
lineas = []

linea = ""
linea << "1"# ! NumeroVias = 1 (1chr)
linea << "N"# FinSemana = N (1chr)
linea << "N"# Nocturno = N (1chr)
linea << "N"# Feriado = N (1chr)
linea << "N"# Urgencias = N (1chr)
lineas << linea

Gracias a Lea Rod estuve mirando la documentación https://ruby-doc.org/core-2.1.5/Encoding.html
y parece que solo tendría que agregar el encoding correcto cuando abró el archivo con "w:ISO-8859-1"

¿Alguno sufrió estos problemas de compatibilidad?



Saludos
Matías Mascazzini
keep in touch about.me/matiasmasca

---
Le recomiendo visitar: www.ComunidadTIC.com.ar

Luis Lavena

unread,
Sep 22, 2016, 7:08:00 PM9/22/16
to rub...@googlegroups.com
Hola Matias,

Te cuento que el encoding no tiene en si nada que ver con el problema que estas observando en el archivo que generas.

En relalidad el problema esta originado por los caracteres de final de linea (EOL, End Of Line) que son diferentes entre POSIX(Unix, Linux y derivados) y Windows.

En POSIX, por defecto el caracter de EOL es uno solo: \n (ASCII 10) y significa newline (nueva linea)

En Windows, sin embargo, emplea dos caracteres: \r\n (ASCII 13 y ASCII 10) que significan carriage return).

Estas configuraciones de EOL se las conoce como LF (Line Feed, avance de linea) y CRLF (Carriage Return + Line Feed)

Sin ahondar mucho en la historia de eso (te lo dejo como tarea para la casa), podrias resolverlo a esto indicando explicitamente que deseas terminar cada linea con CRLF:

lineas.each do |linea|
  salida.print linea
  salida.print "\r\n"
end

Observa que use `print` y no `puts`. Tambien podrias usar `write` que tienen los mismos efectos.

Esto garantizaria que el formato del archivo generado es consistente.

Tambien puedes asegurarte que al abrir el archivo (File.open) estas usando el modo binario "wb", de tal manera que correr el mismo script en Windows (por si lo necesitaras) generaria los mismos resultados.

Por ultimo y no menos importante, el tema del encoding solo te haria falta si el contenido del documento que estas generando tiene acentos o caracteres especiales. De ser asi, tal vez sea mejor uses Windows-1252 (CP 1252) como encoding ya que es lo que WIndows mejor soporta.

Espero te sea de ayuda.

Saludos

--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+unsubscribe@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--
Luis Lavena
AREA 17
-
Perfection in design is achieved not when there is nothing more to add,
but rather when there is nothing more to take away.
Antoine de Saint-Exupéry

Matias Mascazzini

unread,
Sep 22, 2016, 9:17:22 PM9/22/16
to rubysur
Muchas gracias Luis, voy a investigar y probar eso que me decís.

Y gracias por mostrar lo equivocado que estoy en la fuente del problema, honestamente pensé lo del salto de linea pero me imagine que ruby lo hacia automáticamente.



Saludos
Matías Mascazzini
keep in touch about.me/matiasmasca

---
Le recomiendo visitar: www.ComunidadTIC.com.ar

Reply all
Reply to author
Forward
0 new messages