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 „Gefällt mir“

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 „Gefällt mir“

@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 „Gefällt mir“

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 „Gefällt mir“

Wir haben dies zum Laufen gebracht, indem wir einen einfachen Befehl hinzugefügt haben, um die Datei beim Lesen als UTF-8 zu kodieren, z. B. encode\"UTF-8\" in den Zeilen 76-80 des vanilla.rb-Importskripts.

Ich warte noch auf die Bestätigung der genauen Syntax von demjenigen, der es über die Befehlszeile gemacht hat. Ich werde dies aktualisieren, sobald ich sie habe.

1 „Gefällt mir“

Hier ist, was er zur Behebung dieses Problems verwendet hat, beginnend in Zeile 76 von vanilla.rb

def read_file
  puts "reading 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 „Gefällt mir“

Ein Beitrag wurde in ein neues Thema aufgeteilt: Wie bearbeite ich ein Importskript auf dem Produktionsserver?

Das funktioniert nicht. Gleicher Fehler.

Sie müssen bei Google nach Kodierung suchen und herausfinden, wie Sie Ihre fehlerhafte Kodierung beheben können.

Hallo @ddeveloper,

Ich habe diesen Prozess vor ein paar Monaten durchlaufen (und ich bin kein Entwickler :slightly_smiling_face:) und habe es geschafft, ein selbst gehostetes Vanilla-Forum erfolgreich zu einem selbst gehosteten Discourse zu migrieren. Ein wichtiger Punkt für mich war, sicherzustellen, dass ich bei der Datenexportierung mit Vanilla Porter im ersten Dropdown-Menü „Vanilla 2“ als Source Forum Type auswähle.

Ich habe die Vanilla Porter 2.6-Version verwendet, die hier als Zip-Datei heruntergeladen werden kann: Vanilla Porter 2.6 RC1 — Vanilla Forums anstelle der 2.5-Version, die unter Migrate a Vanilla forum to Discourse verlinkt ist.

Wenn ich mich richtig erinnere, ist mir der UTF-8-Fehler bei der Verwendung des neueren Vanilla Porter-Skripts und des „Vanilla 2“-Forumtyps nicht wieder aufgetreten.

Wenn diese beiden Vorschläge bei Ihrem Import keinen Unterschied machen, geben Sie bitte einige Details zu den bisher unternommenen Schritten und genau das an, was Sie sehen. Manchmal gibt es geringfügige Abweichungen zum „gleichen Fehler“, die bei der Fehlerbehebung einen großen Unterschied machen können.

5 „Gefällt mir“

Ich habe dieselbe Anleitung befolgt, nur mit der Porter-Version 2.6. Ich werde die Exportdatei von Version 2.6 verwenden und hier aktualisieren.

Okay, ich habe Porter 2.6 ausprobiert und es gab denselben UTF-8-Fehler:

Bisher habe ich diese Anleitung befolgt: Migrate a Vanilla forum to Discourse

Alles lief gut, bis zu diesem UTF-8-Kodierungsfehler. Einige Leute haben dieses Problem gelöst. Ich habe diese versucht, aber es hat bei mir nicht funktioniert.

Ich habe @Nick_Chomey 's Lösung oben versucht; versucht, die UTF-8-Kodierung beim Lesen der TXT-Datei zu erzwingen, aber zu meiner Verzweiflung hat es auch nicht funktioniert.

Nur um sicherzugehen, welchen Source Forum Type haben Sie im Vanilla Porter Dropdown-Menü ausgewählt?

Könnten Sie uns bitte mitteilen, welche Art von Computer Sie verwenden? Die Anweisungen zur Konvertierung Ihrer Datei in die UTF-8-Kodierung variieren.

1 „Gefällt mir“

Vielen Dank, dass Sie sich die Zeit nehmen, einem anderen Diskussionsforum-Nutzer zu helfen.

Ich habe „Vanilla 2“ unter Source Forum Type ausgewählt.

Ich kann sowohl Windows- als auch Linux-basierte Geräte verwenden und habe Zugriff auf beides.