Fehler beim Import aus Vanilla: ungültige Byte-Sequenz in UTF-8

Ich versuche, Daten aus einem Vanilla-Forum gemäß den Anweisungen hier zu importieren. Beim Ausführen des Import-Skripts vanilla.rb erhalte ich jedoch folgenden Fehler:

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)

Ich habe versucht, den Zeichensatz der MySQL-Datenbank gemäß den Anweisungen hier auf UTF8 umzustellen und die Exportdatei erneut zu exportieren, aber das Problem besteht weiterhin. Haben Sie einen Vorschlag?

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 Bist du dem schon auf den Grund gegangen?

Du kannst einfach nach Informationen zur UTF-8-Kodierung googeln. Du musst etwas tun, um die Tabelle in UTF-8 zu konvertieren. Als ich das gemacht habe, gab es zusätzliche Komplikationen, weil einige Zeilen in einem Format und andere in einem anderen Format vorlagen. Ich glaube, ich habe etwas Unsinniges gemacht, indem ich die Konvertierung werteweise durchgeführt habe.

1 „Gefällt mir“

Klingt schrecklich… Wir müssen mit der Tabellencodierung herumspielen und sehen, was passiert. Danke!

Oh. Das ist schrecklich. Deine beste Chance, basierend auf einer vagen Erinnerung an ein einziges Mal, als ich das vor über einem Jahr gemacht habe, besteht darin, mit so vielen verschiedenen Konvertierungen herumzuspielen, bis du endlich eine findest, die für alle oder die meisten Daten funktioniert. Ich glaube, ich habe eine Menge Einzeltransformationen durchgeführt, die sich als Zeitverschwendung herausstellten, bis ich auf eine Konvertierung stieß, die für alle (die meisten?) Daten funktionierte.

Hier ist, was ich getan habe. Auf eigene Gefahr verwenden. (Das war vBulletin, falls es von Interesse ist).

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

    # Windows 1252
    all = ''
    win_encoded = ''

    ### WIN1252-Kodierung
    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 fehlgeschlagen für \n\n#{raw}\n\n"
      win_encoded = ''
    end

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

Wird dieser Code im Import-Skript oder auf der Server-/Datenbankseite verwendet?

Im Importskript. Ich mag es nicht, mich mit der Datenbank zu befassen.

Irgendwo rufen Sie diese Funktion auf raw auf, um raw (und vielleicht Titel?) zu korrigieren.

Ok, vielen Dank! Das wird mir beim Debuggen einen riesigen Vorsprung verschaffen.

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.