utf8 texto subtitulos subida formato convertir como codificar codificación codificacion cambie cambiar archivo ruby byte-order-mark

ruby - texto - convertir xml a utf 8



¿Hay alguna forma de eliminar la lista de materiales de un archivo codificado en UTF-8? (5)

¿Hay alguna forma de eliminar la lista de materiales de un archivo codificado en UTF-8?

Sé que todos mis archivos JSON están codificados en UTF-8, pero la persona que ingresó los datos que los editó los guardó como UTF-8 con la lista de materiales.

Cuando ejecuto mis scripts de Ruby para analizar el JSON, está fallando con un error. No quiero abrir manualmente más de 58 archivos JSON y convertirlos a UTF-8 sin la lista de materiales.


Entonces, ¡la solución fue hacer una búsqueda y reemplazo en la lista de materiales a través de gsub! Forcé la codificación de la cadena a UTF-8 y también forcé que el patrón de expresiones regulares se codificara en UTF-8.

Pude encontrar una solución en http://self.d-struct.org/195/howto-remove-byte-order-mark-with-ruby-and-iconv y http://blog.grayproductions.net/articles/ruby_19s_string

def read_json_file(file_name, index) content = '''' file = File.open("#{file_name}//game.json", "r") content = file.read.force_encoding("UTF-8") content.gsub!("/xEF/xBB/xBF".force_encoding("UTF-8"), '''') json = JSON.parse(content) print json end


La codificación "bom | UTF-8" funciona bien si solo lees el archivo una vez, pero falla si alguna vez llamas rebobinado del archivo #, como estaba haciendo en mi código. Para abordar esto, hice lo siguiente:

def ignore_bom @file.ungetc if @file.pos==0 && @file.getc != "/xEF/xBB/xBF".force_encoding("UTF-8") end

que parece funcionar bien. No estoy seguro de si hay otros caracteres de tipo similar a los que hay que tener en cuenta, pero podrían incorporarse fácilmente en este método al que se puede llamar en cualquier momento en que rebobine o abra.


Servidor de limpieza del lado de utf-8 bom bytes que funcionó para mí:

csv_text.gsub!("/xEF/xBB/xBF".force_encoding(Encoding::BINARY), '''')


También puede especificar la codificación con los métodos File.read y CSV.read , pero no especifica el modo de read .

File.read(path, :encoding => ''bom|utf-8'') CSV.read(path, :encoding => ''bom|utf-8'')


Con ruby> = 1.9.2 puedes usar el modo r:bom|utf-8

Esto debería funcionar (no lo he probado en combinación con json):

json = nil #define the variable outside the block to keep the data File.open(''file.txt'', "r:bom|utf-8"){|file| json = JSON.parse(file.read) }

No importa si la lista de materiales está disponible en el archivo o no.

Andrew comentó que el File#rewind no se puede usar con BOM.

Si necesita una función de rebobinado, debe recordar la posición y reemplazar el rewind con pos= :

#Prepare test file File.open(''file.txt'', "w:utf-8"){|f| f << "/xEF/xBB/xBF" #add BOM f << ''some content'' } #Read file and skip BOM if available File.open(''file.txt'', "r:bom|utf-8"){|f| pos =f.pos p content = f.read #read and write file content f.pos = pos #f.rewind goes to pos 0 p content = f.read #(re)read and write file content }