Error al importar desde vanilla: secuencia de bytes inválida en UTF-8

Estoy intentando importar desde un foro Vanilla utilizando las instrucciones publicadas aquí. Sin embargo, obtengo el siguiente error al ejecutar el script de importación vanilla.rb:

Cargando grupos existentes...
Cargando usuarios existentes...
Cargando categorías existentes...
Cargando publicaciones existentes...
Cargando temas existentes...
analizando archivo...
leyendo archivo...
Traceback (most recent call last):
	5: from script/import_scripts/vanilla.rb:254:in `<main>'
	4: from /var/www/discourse/script/import_scripts/base.rb:47:in `perform'
	3: from script/import_scripts/vanilla.rb:17:in `execute'
	2: from script/import_scripts/vanilla.rb:37:in `parse_file'
	1: from script/import_scripts/vanilla.rb:72:in `read_file'
script/import_scripts/vanilla.rb:72:in `gsub': secuencia de bytes no válida en UTF-8 (ArgumentError)

He intentado cambiar el conjunto de caracteres de la base de datos MySQL a UTF8 siguiendo las instrucciones aquí y luego volver a exportar el archivo de Porter, pero eso no resolvió el problema. ¿Alguna sugerencia?

1 me gusta

You either need to keep trying to get it to really be UTF-8 or modify the import script to do it. It is a frustrating problem.

2 Me gusta

@dpkoch ¿Lograste resolver esto?

Puedes buscar información sobre la codificación UTF-8. Necesitas hacer algo que fuerce la tabla a UTF-8. La vez que lo hice, hubo complicaciones adicionales porque algunas filas estaban en un formato y otras en otro. Creo que hice algo sin sentido donde forcé los valores uno por uno.

1 me gusta

Suena terrible… Tendremos que ajustar la codificación de la tabla y ver qué sucede. ¡Gracias!

Oh. Es terrible. Tu mejor opción, basada en un vago recuerdo de una sola vez que hice esto hace más de un año, es probar con tantas conversiones diferentes como puedas hasta que finalmente encuentres una que funcione para todos o la mayoría de los datos. Creo que realicé varias transformaciones una por una que terminaron siendo una pérdida de tiempo cuando tropecé con alguna conversión que funcionaba para todos (¿la mayoría?) de los datos.

Esto es lo que hice. Úsalo bajo tu propio riesgo. (Esto era vbulletin, por si acaso).

  def char_map(raw_original)
    raw = raw_original.dup
    debug = false # (raw.length > 50)

    # windows 1252
    all = ''
    win_encoded = ''

    ### Codificación WIN1252
    win_encoded = ''
    begin
      win_encoded = raw.force_encoding('utf-8').encode("Windows-1252",
                            invalid: :replace, undef: :replace, replace: ""
                           ).force_encoding('utf-8').scrub
    rescue => e
      puts "\n#{'-'*50}\nWin1252 falló para \n\n#{raw}\n\n"
      win_encoded = ''
    end

    ### Codificación ISO 8859
    iso_encoded = ''
    if all.length == 0 && win_encoded.length > 0 && win_encoded != raw
      all = (debug ? "Win1252--" : '') + win_encoded
    else
      all = raw
    end
    all = old_char_map(all)
    all
  end

¿Ese código se utiliza dentro del script de importación o en el lado del servidor/base de datos?

En el script de importación. No me gusta alterar la base de datos.

En algún lugar se llama a esta función sobre raw para corregir raw (¿y quizás los títulos?).

¡Ok, muchas gracias! Esto debería darme una gran ventaja inicial para depurar esto.

1 me gusta

Logramos que esto funcionara añadiendo un simple comando para codificar el archivo como UTF-8 al leerlo, usando algo como encode\"UTF-8\" en las líneas 76-80 del script de importación vanilla.rb.

Solo estoy esperando la confirmación de la sintaxis exacta del chico que lo hizo por línea de comandos. Actualizaré esto cuando la tenga.

1 me gusta

Aquí está lo que usó para arreglar esto, comenzando en la línea 76 de vanilla.rb

def read_file
  puts "leyendo archivo..."
  string = [File.read](http://file.read/)(@vanilla_file)
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\N", "")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\$\n/m, "\\n")
    .force_encoding('UTF-8').encode("UTF-8").gsub("\\,", ",")
    .force_encoding('UTF-8').encode("UTF-8").gsub(/(?<!\\)\\"/, '""')
    .force_encoding('UTF-8').encode("UTF-8").gsub(/\\\\\\"/, '\\\"\"')
  [StringIO.new](http://stringio.new/)(string)
end
1 me gusta

Se dividió una publicación en un nuevo tema: ¿Cómo editar un script de importación en el servidor de producción?

Esto no funciona. Mismo error.

Necesitas buscar en Google sobre codificación y averiguar cómo arreglar tu codificación rota.

Hola @ddeveloper,

Trabajé en este proceso hace solo un par de meses (y no soy desarrollador :slightly_smiling_face:) y logré migrar con éxito un foro Vanilla autoalojado a Discourse autoalojado. Algo que fue clave para mí fue asegurarme, al exportar los datos con Vanilla Porter, de seleccionar “Vanilla 2” como el Source Forum Type en el primer menú desplegable.

Utilicé la versión 2.6 de Vanilla Porter disponible para descargar como un archivo zip aquí: Vanilla Porter 2.6 RC1 — Vanilla Forums en lugar de la versión 2.5 enlazada en Migrate a Vanilla forum to Discourse.

Si mal no recuerdo, no volví a encontrar el error UTF-8 al usar el script más reciente de Vanilla Porter y el tipo de foro “Vanilla 2”.

Si esas dos sugerencias no marcan la diferencia en tu importación, por favor, proporciona algunos detalles sobre los pasos que has seguido hasta ahora y exactamente lo que estás viendo. A veces hay ligeras variaciones en el “mismo error” que pueden marcar una gran diferencia al solucionar problemas.

5 Me gusta

He seguido la misma guía excepto usando la versión porter 2.6. Exportaré el archivo de la versión 2.6 y actualizaré aquí.

Okay, he intentado con porter 2.6 y ha resultado en el mismo error de UTF-8:

Hasta ahora, he seguido esta guía: Migrate a Vanilla forum to Discourse

Todo salió bien hasta este error de codificación UTF-8. Algunas personas han resuelto este problema. Lo he intentado y no me ha funcionado.

Intenté la solución de @Nick_Chomey anterior; intentando forzar la codificación utf-8 al leer el archivo txt, pero para mi pesar, tampoco funcionó.

Solo para estar seguros, ¿qué Tipo de foro de origen seleccionaste en el menú desplegable de Vanilla Porter?

¿Podrías decirnos qué tipo de computadora estás usando? Las instrucciones para convertir tu archivo a codificación UTF-8 variarán.

1 me gusta

Gracias por tomarte el tiempo de ayudar a un compañero de Discourse.

Seleccioné “Vanilla 2” en Source Forum Type.

Puedo usar dispositivos basados en Windows y Linux y tengo acceso a ambos.