Error importing from vanilla: invalid byte sequence in UTF-8

I’m trying to import from a Vanilla forum using the instructions posted here. However, I get the following error when I run the vanilla.rb import script:

Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
parsing file...
reading file...
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': invalid byte sequence in UTF-8 (ArgumentError)

I’ve tried changing the MySQL database character set to UTF8 following the instructions here and then re-exporting the porter file, but that didn’t resolve the issue. Any suggestions?

1 Mi Piace

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 Mi Piace

@dpkoch Did you ever figure this out?

You can google stuff about UTF-8 encoding. You need to do something that will coerce the table into UTF-8. The time that I did it, there were further complications because some rows were in one format and others in another format. I think that I did some nonsense where I coerced things on a value-by-value basis.

1 Mi Piace

Sounds awful… We’ll have to tinker with the table encoding and see what happens. Thanks!

Oh. It’s aweful. You best bet, based on a vague recollection of a single time I did this over a year ago, is to play around with as many different conversions as you can until you can finally hit on one that works for all or most data. I think that I did a bunch of one-by-one transformations that ended up being a waste of time when I stumbled on some conversion that worked for all (most?) data.

Here is what I did. Use at your own risk. (This was vbulletin, FWIW).

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

    # windows 1252
    all = ''
    win_encoded = ''

    ### WIN1252 encoding
    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 failed for \n\n#{raw}\n\n"
      win_encoded = ''
    end

    ### ISO 8859 encoding
    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

That code is used within the import script or on the server/database side?

In the import script. I don’t like to mess with the database.

Somewhere you call this function on raw to fix raw (and maybe titles?).

Ok, thanks very much! This should give me a huge head-start in debugging this.

1 Mi Piace

Siamo riusciti a farlo funzionare aggiungendo un semplice comando per codificare il file come UTF-8 durante la lettura, usando qualcosa come encode\"UTF-8\" alle righe 76-80 dello script di importazione vanilla.rb.

Sto solo aspettando la conferma della sintassi esatta da parte del ragazzo che l’ha fatto tramite riga di comando. Aggiornerò questo quando l’avrò.

1 Mi Piace

Ecco cosa ha usato per risolvere questo problema, a partire dalla riga 76 di vanilla.rb

def read_file
  puts "lettura file..."
  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 Mi Piace

Un post è stato diviso in un nuovo argomento: Come modificare uno script di importazione sul server di produzione?

Non funziona. Stesso errore.

Devi cercare su Google la codifica e capire come risolvere la tua codifica errata.

Ciao @ddeveloper,

Ho lavorato a questo processo solo un paio di mesi fa (e non sono uno sviluppatore :slightly_smiling_face:) e sono riuscito a migrare con successo un forum Vanilla self-hosted a Discourse self-hosted. Una cosa che è stata fondamentale per me è stata assicurarmi, durante l’esportazione dei dati con Vanilla Porter, di selezionare “Vanilla 2” come Source Forum Type nel primo menu a discesa.

Ho utilizzato la versione 2.6 di Vanilla Porter disponibile per il download come file zip qui: Vanilla Porter 2.6 RC1 — Vanilla Forums invece della versione 2.5 collegata in Migrate a Vanilla forum to Discourse.

Se ricordo bene, non ho più riscontrato l’errore UTF-8 quando ho utilizzato lo script Vanilla Porter più recente e il tipo di forum “Vanilla 2”.

Se questi due suggerimenti non fanno differenza per la tua importazione, ti prego di fornire alcuni dettagli sui passaggi che hai intrapreso finora e su cosa stai vedendo esattamente. A volte ci sono lievi variazioni allo “stesso errore” che possono fare una grande differenza nella risoluzione dei problemi.

5 Mi Piace

Ho seguito la stessa guida tranne che ho usato la versione porter 2.6. Esporterò il file dalla versione 2.6 e aggiornerò qui.

Okay, ho provato porter 2.6 e ha prodotto lo stesso errore UTF-8:

Finora, ho seguito questa guida: Migrate a Vanilla forum to Discourse

Tutto è andato bene fino a questo errore di codifica UTF-8. Alcune persone hanno risolto questo problema. Ho provato quelle soluzioni, ma non hanno funzionato per me.

Ho provato la soluzione di @Nick_Chomey sopra; cercando di imporre la codifica utf-8 durante la lettura del file txt, ma con mio grande rammarico non ha funzionato neanche.

Per sicurezza, quale Source Forum Type hai selezionato nel menu a discesa di Vanilla Porter?

Potresti dirci che tipo di computer stai usando? Le istruzioni per convertire il tuo file in codifica UTF-8 varieranno.

1 Mi Piace

Grazie per aver dedicato del tempo ad aiutare un altro utente.\n\nHo selezionato “Vanilla 2” in Source Forum Type.\n\nPosso usare sia dispositivi basati su Windows che su Linux e ho accesso a entrambi.