Ein weiteres Kapitel im endlosen Buch "schei? encoding". Ein Datenbankdump mit special characters. Es ist der upgrade vom upgrade vom... eines Mediawiki. Ein paar Umlaute sind inzwischen unrettbar kaputt. Allerdings wird die Datenbank so beim Verarbeiten mit "update.php" drastisch gekürzt. Mit ein paar vereinzelten kaputten Umlauten kann man noch leben, mit abgeschnittenem Inhalt nicht.
Jetzt muss repariert werden.
Kurz zusammengefasst: die meisten richtigen Umlaute bekomme ich aus der Datenbank, die eigentlich utf8 wäre, noch heraus, wenn ich den MySQL Dump folgendermaßen mache:
mysqldump --opt -u root -psupergeheim --default-character-set=latin1 --skip-set-charset diedatenbank >diedatenbank.sql
So ließe sich die db auch anstandslos vollständig importieren, allerdings schneidet Mediawikis "
php update.php" beim Upgrade immer noch die Beiträge ruppig am ersten kaputten Umlaut ab.
Öffne ich so einen Dump in
less, tauchen schwarz hervor gehobene Zeichen auf:
<C3>?ber
In diesem Fall ist es eindeutig ein kaputtes Ü, allerdings taucht die selbe Zeichenkette auch mit anderen kaputten Umlauten auf, eine eindeutige Zuordnung ist leider nicht mehr möglich.
Wie oft im gesamten Dump kommt die Zeichenkette vor? Das lässt sich mit grep oder sed feststellen:
grep -c --perl-regexp "\xC3\?" meinedb.sql
sed '/\xC3?/!d' meinedb.sql | sed -n '$='
Danach kann im Textfile ein ganzer Haufen der problematischen Zeichen ersetzt werden:
sed -e 's/\xC3?bung/Übung/g' -e 's/ie\xC3?/ieß/g' -e 's/ä\xC3?/äß/g' -e 's/äu\xC3?/äuß/g' -e 's/ö\xC3?/öß/g' -e 's/\xC3?ber/Über/g' -e 's/\xC3?BB/ÖBB/g' -e 's/derma\xC3?/dermaß/g' -e 's/\xC3? /ß /g' <test.txt >test2.txt
Obige Liste muss natürlich noch um Einiges erweitert werden.
Ganz zum Schluss zur Sicherheit noch:
sed -e 's/\xC3?/?/g' <test.txt >final.sql
Richtig, die letzten noch unentdeckten Kaputtniks werden geopfert und durch ein Fragezeichen ersetzt. Lieber ein schlichtes Fragezeichen, als abgeschnittener Text.
Der bereinigte Dump wird dann wieder eingespielt:
mysql -u root -psupergeheim --default-character-set=utf8 meinedb <meinedb-sauber.sql
Nun kann der Mediawiki Upgrade endlich durchgeführt werden (update.php).
Danach ein kleiner Stoßseufzer der Mediawiki geplagten Administratorin:
update.php läuft einwandfrei durch, nichts wird abgeschnitten, allerdings ist das Encoding der Datenbanktabellen dann wieder kaputt. Diesmal ist es aber unproblematisch.
Ein kurzer Export/Import rückt alles gerade, MySQL richtet's wieder.
mysqldump --opt -u root -psupergeheim --default-character-set=latin1 --skip-set-charset meinedb >meinedb.sql
mysql -u root -psupergeheim --default-character-set=utf8 meinedb <meinedb.sql
Danach noch mal ein kleiner
touch LocalSettings.php
damit der Mediawiki Cache noch mal geleert wird.
Geschafft.
Bis zum nächsten Mediawiki Update, das (vermutlich) das Encoding wieder zerschießt