Version 3.x oder 4.x (5.x weiß ich nicht genau), und es soll nicht alles komplett neu installiert/eingestellt/datenimportiert werden?
Sorry, das geht nicht gut. Vergiss es.
Für die "einfachste" Lösung wäre ein custom Build von PHP nötig. Hab das vor einger Zeit probiert, im Zuge eines DB-Software-Wechsels...
a) Zuerstmal alle Stellen finden, die umgestellt werden müssen. Ca. 30 einstellungsmäßig (andere Systeme kommen mit einer Einstellung aus), dazu natürlich noch die DB konvertieren. Lästig, aber einfach.
b) Weiße Seite. Bemerken, dass manche Codestellen im Core (und auch in Plugins, aber da kann VB nichts dafür) einfach nicht für Unicode gemacht sind. Ausbessern. Lästiger, aber geht ja noch.
c) Weiße Seite. Bemerken, dass manche DB-Einträge Datenblocke im PHP-Serialize-Format enthalten (haben diese
Typen noch nie was von Normalisierung gehört)? Das Problem dabei ist, zu jedem String in so einem Block ist auch die Bytelänge mit abgespeichert. Wenn Umlaute etc. drin sind ist die mit UTF8 natürlich anders. Alte Bytelängenangaben aber neue Daten, unserialize() in PHP weigert sich und gibt nur false zurück.
Mögliche Lösung 1: Eben den PHP-Source holen, unserialize umprogrammieren (bevor false auch noch probieren ob die Länge zum alten Charset passte). Wollte ich nicht (müsste das bei jedem Sicherheitsupdate alles neu kompilieren usw.usw.), also:
Mögliche Lösung 2: Ein Programm schreiben dass mir einen DB-Dump nach diesem Serialize-Textformat durchsucht (dabei auch aufpassen, dass man wohl keine Sachen erwischt, die nur so ausschauen), und neue Bytelängen eintragen
An dem Punkt war ich "etwas" genervt, aber gut.
d) Merken, dass 40% der gefundenen Serializeblöcke Bytelängen haben, die auch für den alten Zeichensatz eigentlich ungültig sind. Im Code nachgeforscht ... Es wird nicht etwas der Inhalt einer DB-"Zelle" genommen und unserialisiert. Nein, wäre ja viel zu einfach. Es wird eine Zelle genommen, das } am Ende entfernt, der Inhalt einer anderen Zelle irgendwo aus einer anderen Tabelle dazugehängt, wieder ein } dazugemacht, und erst dann hat man den unserializierbaren Inhalt, für den die Längen gelten (die in einer Zelle allein gestanden sind). Und solche Situationen gibts mehrere Tausend mit Core-Code, natürlich immer andere beteiligte Tabellen für andere Spezialsituationen. (Das hat mir gereicht).
...
Die Seite ist noch immer auf ISO88591, aber sie wird in Kürze mit Xenforo ersetzt.
(btw., VB3 und VB4 haben keinen Support für PHP7
)
Was man bei einer Umstellung zu Xenforo dbmäßig aufpassen muss beschreib ich dir auch gerne
Beim "empfangen" des Textes mittels strip_tags und htmlspecialchars den Text filtern.
Vor dem Einfügen in die DB ist das eigentlich nicht nötig.