Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: MauriH en 20 Enero 2016, 01:05 am



Título: Cambiar codificación de caracteres en Ruby
Publicado por: MauriH en 20 Enero 2016, 01:05 am
Por favor alguien ayúdeme, no puedo cambiar la codificación de carácteres de un archivo de texto, de ANSI a UTF-8, :-\ tengo instalado el interprete de ruby. Tengo conocimientos básicos en este lenguaje. He investigado pero no he encontrado mucha info en español y la que he encontrado no me ha servido. Gracias de antemano.


Título: Re: Cambiar codificación de caracteres en Ruby
Publicado por: Eleкtro en 20 Enero 2016, 02:18 am
Cambiar codificación de caracteres en Ruby

cambiar la codificación de carácteres de un archivo de texto

Una cosa es la codificación de caracteres del archivo de texto plano o Script, y otra es la codificación de caracteres asociada al intérprete de Ruby. Especifica lo que realmente necesitas modificar.

Lo primero lo puedes hacer con el Notepad mismo, Archivo -> Guardar Como... -> codificación: UTF-8
También podrás hacerlo con tu editor de texto favorito.

Para lo segundo, debes declarar la siguiente linea de comentario en la cabecera del script, es decir arriba dle todo en la primera linea del script:
Código
  1. # encoding: UTF-8
...aunque a partir de ruby 2.0 la codificación por defecto ya es UTF-8.
  • http://docs.ruby-lang.org/en/2.1.0/Encoding.html#class-Encoding-label-Script+encoding

De todas formas sospecho que el problema real que tienes es que no sabes como representar en el intérprete de Ruby el set de caracteres asociado a la página de código ANSI actual de tu PC, y eso lo podrías solucionar así:
Código
  1. # encoding: Windows-1252
  • https://en.wikipedia.org/wiki/Windows-1252

Saludos!


Título: Re: Cambiar codificación de caracteres en Ruby
Publicado por: MauriH en 20 Enero 2016, 02:56 am
Lo primero lo puedes hacer con el Notepad mismo, Archivo -> Guardar Como... -> codificación: UTF-8

Gracias por la respuesta, justamente utilizo el notepad++ lo que quiero es lo primero q dijiste, pero en masa, tengo 17583 ficheros que quiero convertir de ansi a utf-8, si lo hago manualmente no termino nunca.

Mira, lo que ocurre en si, es que esos 17583 archivos son creados a partir de la captura de ciertas lineas de otro documento de texto que es muy largo y esta codificado en utf-8, con un script hecho en ruby que fue creado en notepad++ por tanto tb esta codificado en utf-8, de todos modos en la parte superior pongo el comentario magico #encoding: utf-8, lo que hace es practicamente copiar fragmentos del documento largo, y crear nuevos archivos con extension html para guardar esos fragmentos, lo cuales son documentos html que tienen la etiqueta <meta charset="utf-8">. Una vez hecho esto los documentos html al ser mostrados en el navegador no muestran algunos caracteres correctamente como el simbolo de interrogación abierto. Solo se ven unos cuadraditos en Internet Explorer. Claro, yo habia pensado en fragmentar el archivo largo convirtiendo la codificación a ANSI con el notepad++ para que salgan bien los carateres y luego una vez creados los archivos html en ANSI convertirlos a utf-8, pero creo q debe haber una mejor manera de hacer eso, algo así como un codigo que directamente al crear el archivo te salga en utf-8 y te muestre correctamente los caracteres. Espero haberme explicado bien.
Gracias.


Título: Re: Cambiar codificación de caracteres en Ruby
Publicado por: Eleкtro en 20 Enero 2016, 03:42 am
En Ruby la manera más abstracta y sencilla de hacer la conversión tal vez sea con la librería/gema iconv.

Tengo bastante olvidado Ruby, pero te doy la idea del posible código:
Código
  1. # -*- coding: Windows-1252 -*-
  2.  
  3. require 'iconv'
  4.  
  5. Dir.glob('.\*.txt') do |file|
  6.  
  7. strANSI = File.open(file).read
  8. strUTF8 = Iconv.iconv("UTF-8", "Windows-1252", strANSI).join # (To encoding, From encoding)
  9.  
  10. File.open(file, "w") { |f| f.puts strUTF8 }
  11.  
  12. end
  13.  
  14. Process.exit
  15. __END__
(no lo he testeado)

PD: Si no tienes la librería/gema Iconv debes instalartela, y antes de eso debes instalarte el devkit de Ruby.



En lugar de desarrollar el algoritmo en un lenguaje de programación también podrías optar por hacer un simple loop a los archivos y pasarle las rutas como argumento a la siguiente aplicación command-line:

  • http://www.gofunnow.com/textencodeconverter/index.htm#Whats%20New

El comando es simple:

Código:
tec.exe "archivo.txt" -de:33
Se convierte el archivo.txt a formato de texto número 33,o el que queramos, de esta lista:

(http://www.gofunnow.com/textencodeconverter/index.1.gif)

En su día la probé y me funcionó muy bien.

Saludos