Problema de codificación con Sqlite3 en Ruby

Tengo una lista de consultas sql bellamente codificadas en utf-8. Los leo de los archivos, realizo las inserciones y luego hago una selección.

# encoding: utf-8 
def exec_sql_lines(file_name)
  puts "----> #{file_name} <----"
  File.open(file_name, 'r') do |f|
    # sometimes a query doesn't fit one line
    previous_line=""
    i = 0
    while line = f.gets do
      puts i+=1

      if(line[-2] != ')')
        previous_line += line[0..-2]
        next
      end

      puts (previous_line + line)  #  <----  (1)

      $db.execute((previous_line + line))
      previous_line =""
    end
    a = $db.execute("select * from Table where _id=6")
    puts a <---- (2)
  end
end

$db=SQLite3::Database.new($DBNAME)
exec_sql_lines("creates.txt")
exec_sql_lines("inserts.txt")
$db.close

El texto en (1) es diferente al de (2). Las letras polacas se rompen. Si uso IRB y llamo $db.abrir ; $db.codificación es dice UTF-8.

¿Por qué las letras polacas salen rotas? ¿Como arreglarlo?

Necesito esta base de datos correctamente codificada en UTF-8 para mi aplicación de Android, por lo que no estoy interesado en manipular la salida de la base de datos. Necesito arreglar su contenido.

EDITAR

Líneas significativas de la salida:

6
INSERT INTO 'Leki' VALUES (NULL, '6', 'Acenocoumarolum', 'Acenocumarol WZF', 'tabl. ', '4 mg', '60 tabl.', '5909990055715', '2012-01-01', '2 lata', '21.0, Leki przeciwzakrzepowe z grupy antagonistów witaminy K', '8.32', '12.07', '12.07', 'We wszystkich zarejestrowanych wskazaniach na dzień wydania decyzji', '', 'ryczałt', '5.12')

fuera:

6
6
Acenocoumarolum
Acenocumarol WZF
tabl. 
4 mg
60 tabl.
5909990055715
2012-01-01
2 lata
21.0, Leki przeciwzakrzepowe z grupy antagonistĂł[<--HERE]w witaminy K
8.32
12.07
12.07
We wszystkich zarejestrowanych wskazaniach na dzieĹ[<--HERE] wydania decyzji

ryczaĹ[<--HERE]t
5.12

preguntado el 02 de mayo de 12 a las 19:05

(1) ¿Puede proporcionar una muestra de lo que entra y lo que sale? (2) ¿El texto se ve roto si usa el sqlite3 herramienta de línea de comandos para mirarlo? -

(1) listo, (2) sí, además, si pego los comandos sql de los archivos en un programa llamado Explorador de base de datos y los ejecuto, entonces la nueva base de datos está bien. -

1 Respuestas

Existen tres codificaciones predeterminadas.

En su código, establece la codificación de la fuente. ¿Quizás hay un problema con la codificación externa e interna?

Una prueba rápida en Windows:

#encoding: utf-8
File.open(__FILE__,'r'){|f|
  p f.external_encoding
  p f.internal_encoding
  p f.read.encoding
}

Resultado:

#<Encoding:CP850>
nil
#<Encoding:CP850>

Incluso si se usa UTF-8, los datos se leen como cp850.

En su caso: ¿ File.open(filename,'r:utf-8') AYUDA?

contestado el 02 de mayo de 12 a las 20:05

Sí, ayudó. ¡Muchas gracias! - andrzej gis

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.