Errore durante l'importazione da vanilla: sequenza di byte non valida in UTF-8

Sto cercando di importare da un forum Vanilla seguendo le istruzioni pubblicate qui. Tuttavia, ottengo il seguente errore quando eseguo lo script di importazione vanilla.rb:

Caricamento dei gruppi esistenti...
Caricamento degli utenti esistenti...
Caricamento delle categorie esistenti...
Caricamento dei post esistenti...
Caricamento degli argomenti esistenti...
Analisi del file...
Lettura del file...
Traceback (most recent call last):
	5: from script/import_scripts/vanilla.rb:254:in `\u003cmain\u003e'
	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)

Ho provato a modificare il set di caratteri del database MySQL in UTF8 seguendo le istruzioni qui e poi riesportare il file di esportazione, ma ciò non ha risolto il problema. Qualche suggerimento?

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 Sei riuscito a risolvere questo problema?

Puoi cercare informazioni sulla codifica UTF-8 su Google. Devi fare qualcosa per convertire la tabella in UTF-8. La volta in cui l’ho fatto, ci sono state ulteriori complicazioni perché alcune righe erano in un formato e altre in un altro. Credo di aver fatto delle operazioni un po’ arbitrarie, convertendo i valori uno per uno.

1 Mi Piace

Sembra terribile… Dovremo smanettare con la codifica della tabella e vedere cosa succede. Grazie!

Oh. È terribile. La tua migliore scommessa, basata su un vago ricordo di una volta in cui l’ho fatto più di un anno fa, è provare quante più conversioni diverse possibile finché non ne trovi una che funzioni per tutti o per la maggior parte dei dati. Credo di aver eseguito una serie di trasformazioni una per una che si sono rivelate una perdita di tempo, finché non ho scoperto una conversione che funzionava per tutti (la maggior parte?) dei dati.

Ecco cosa ho fatto. Usalo a tuo rischio e pericolo. (Era vbulletin, per la cronaca).

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

    # windows 1252
    all = ''
    win_encoded = ''

    ### Codifica 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 fallito per \n\n#{raw}\n\n"
      win_encoded = ''
    end

    ### Codifica 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

Quel codice viene utilizzato all’interno dello script di importazione o lato server/database?

Nello script di importazione. Non mi piace modificare il database.

Da qualche parte chiami questa funzione su raw per correggere raw (e forse anche i titoli?).

Ok, grazie mille! Questo mi darà un grande vantaggio nel debug di questo problema.

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.