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
}