[HowTo] HowTo convert from iso-xxx to utf-8? wurde Beantwortet

Autor Nachricht
Verfasst am: 04.10.2007 [19:55]
InforMedic


[Themenersteller]
dabei seit: 13.05.2007
Beiträge: 211

Hallo community!

Ich habe mich die letzten 2 Tage ein wenig mit charsets auseinander gesetzt und möchte euch meine Erkentnisse mitteilen.

Um erfolgreich eine bestehende T3 Installation auf utf-8 zu konvertieren sind folgende Schritte notwendig:


    - Typo3 anpassen
    - PHP/MySQL anpassen
    - DB anpassen


Typo3 anpassen

folgendes muss in typo3 erledigt werden:
Typoscript:Zeilennummerierung:  An / Aus

  1. page.config.doctype = xhtml_trans
  2. page.config.xmlprologue = none
  3. page.config.xhtml_cleaning = all
  4. page.config.metaCharset = utf-8
  5. page.config.additionalHeaders = Content-Type:text/html;charset=utf-8


typo3 backend/install tool:
[SYS][setDBinit] = SET NAMES utf8; SET CHARACTER SET utf8;
[SYS][UTF8filesystem] = 1
[BE][forceCharset] = utf-8

t3-extension convert2utf
Mit dieser Extension alle angelegten Seiten nach UTF konvertieren (ist glaub ich für die verwendung von CoolUri interessant, so dass die generierten html-files utf-8 encoded sind)



PHP/MySQL anpassen

In der php.ini unter der Section "mbstring" habe ich folgende Angaben gemacht:
Html4strict:Zeilennummerierung:  An / Aus

  1. mbstring.internal_encoding = UTF-8
  2. default_charset = "UTF-8"
  3.  
  4. ; http input encoding.
  5. mbstring.http_input = UTF-8
  6.  
  7. ; http output encoding. mb_output_handler must be
  8. ; registered as output buffer to function
  9. mbstring.http_output = UTF-8


In der "my.cnf" des mysql servers habe ich
Html4strict:Zeilennummerierung:  An / Aus

  1. character-set-server = utf8
  2. collation-server = utf8_unicode_ci
  3.  
  4. skip-character-set-client-handshake

angegeben.




DB anpassen

ACHTUNG: Hier hatte ich mist gebaut

Es gibt ein typo3 angepasstes script, mit welchem man sich die komplette mysql-db + inhalt konvertieren lassen kann.
Dieses funktioniert nicht -> wenn man zuvor mit phpmyadmin die DB-Kollation gnadenlos auf utf8 umgestellt hat.

Also, nichts via phpmyadmin machen sondern nur über das script, dann werden die umlaute auch entsprechend konvertiert.

Gemeint ist folgendes Script:
/*
* Original-Script von Dennis Blöte
* http://blog.dopefreshtight.de/artikel/von-iso-8859-1-zu-utf-8-in-php-und-mysql/
* http://dennisbloete.de/stuff/db_convert.zip
*
* Angepasst an die Datenbank von TYPO3 4.0.2 von Stefan Macke
* http://blog.stefan-macke.de/2006/11/28/konvertieren-einer-typo3-installation-nach-utf-8/
* http://blog.stefan-macke.de/wp-content/uploads/2006/11/db_convert_typo3.zip
*/

Sämtliche Infos habe ich von diesen beiden Herren entnommen.


Hoffe dass dies für jemanden noch neu und von nutzen ist!!

Grüße
Info

[Dieser Beitrag wurde 1 mal bearbeitet. Zuletzt am 04.10.2007 um 19:57]
Verfasst am: 24.11.2007 [12:29]
brikenv

dabei seit: 18.03.2007
Beiträge: 9

Hallo InforMedic,

vielen vielen Dank für Dein ausführliches HowTo! Ist die erste funktionierende Anleitung die ich bis jetzt im Netz gefunden habe um ein vorhandes Typo3-System nach UTF8 zu kovertieren.
Ich habe mein System für den Test gespiegelt und in dem Testsystem die beschriebenen Schritte mit Aussnahme von der Konfiguration von MySql durchgeführt und es hat wunderbar geklappt. Ich musst elediglich noch einige Strings im Typoscript anpassen.

Bevor ich dies nun im eigentlichen Live-System wiederhole habe ich noch eine Verständnisfrage.
Wozu sind denn die Anpassungen in der PHP/ MySQL Konfiguration? Wäre super, wenn Du die einzelnen Schritte noch kommentieren könntest.
Sind diese absolut notwendig?

Vielen Dank erstmal!
Super!
Gruß brikenv
Verfasst am: 11.12.2007 [21:22]
gstyleds

dabei seit: 19.01.2006
Beiträge: 25

InforMedic schrieb:

Hoffe dass dies für jemanden noch neu und von nutzen ist!!


Hi, ja, ist es! Klasse, vielen Dank, klappt 1a.

Noch als ergänzenden Tipp an die Community: Schaut euch erst eure DB an und tragt in der db_convert.php ab Zeile 76 die Tabellen eurer Extensions nach, z.B. die tt_news:

Php:Zeilennummerierung:  An / Aus

  1. $tables = array(
  2.         array('be_groups'),
  3.         array('be_users'),
  4.         array('fe_groups'),
  5.         ...
  6.         array('tt_news')


Grüße, Dirk
Verfasst am: 09.01.2008 [16:42]
norderik

dabei seit: 09.01.2008
Beiträge: 1

ein Hinweis noch zum db_convert: ca. Zeile 120 steht
Php:Zeilennummerierung:  An / Aus

  1. if(strpos($column['Type'], "char") != false || strpos($column['Type'], "text") != false)

und das funktioniert nicht, da strpos($column['Type'], "text") beim Spaltentyp "text" die Position "0" liefert, was in php identisch mit "false" ist (berühmter Stolperstein).
Der Fehler führt dazu, dass "text"-Felder nicht konvertiert werden und fällt bei der Konvertierung nicht so schnell auf, weil z.B. der bodytext in tt_content den Typ "mediumtext" hat.

Schneller Workaround: künstlichen Offset durch ein vorangestelltes Leerzeichen setzen:
Php:Zeilennummerierung:  An / Aus

  1. if(strpos($column['Type'], "char") != false || strpos(" ".$column['Type'], "text") != false)

Gruß Ernst
Verfasst am: 12.02.2008 [12:04]
davidb


dabei seit: 30.07.2006
Beiträge: 12

norderik schrieb:

ein Hinweis noch zum db_convert: ca. Zeile 120 steht
Php:Zeilennummerierung:  An / Aus

  1. if(strpos($column['Type'], "char") != false || strpos($column['Type'], "text") != false)

und das funktioniert nicht, da strpos($column['Type'], "text") beim Spaltentyp "text" die Position "0" liefert, was in php identisch mit "false" ist (berühmter Stolperstein).
Der Fehler führt dazu, dass "text"-Felder nicht konvertiert werden und fällt bei der Konvertierung nicht so schnell auf, weil z.B. der bodytext in tt_content den Typ "mediumtext" hat.

Schneller Workaround: künstlichen Offset durch ein vorangestelltes Leerzeichen setzen:
Php:Zeilennummerierung:  An / Aus

  1. if(strpos($column['Type'], "char") != false || strpos(" ".$column['Type'], "text") != false)

Gruß Ernst

Auch wenn ich den Tip nicht getestet habe, erscheint er mir etwas fragwürdig.
Generell ist der Hinweis nicht falsch, daß die Syntax falsche Ergebnisse liefern kann, PHP bietet hier jedoch eigene Mittel. Damit müsste es so notiert werden:
Php:Zeilennummerierung:  An / Aus

  1. if(strpos($column['Type'], "char") !== false || strpos($column['Type'], "text") !== false)

Die Notation "!==" bzw. "===" prüft nicht nur auf (Un)Gleichheit sondern auch auf den richtigen Typ, da der Typ boolean ist, liefert auch 0 das gewünschte Ergebnis.

Gruß David
Verfasst am: 12.02.2008 [12:23]
davidb


dabei seit: 30.07.2006
Beiträge: 12

Das 2. Skript (von Stephan Macke) weist einen redundaten Abschnitt auf, und zwar kann man die Abfrage
Php:Zeilennummerierung:  An / Aus

  1. if ($numrows > 2000)
  2.                 {
weglassen und das gesamte
Php:Zeilennummerierung:  An / Aus

  1. } else { ... }
auch, da hier nichts anderes steht als in dem Abschnitt darüber. Wenn man weniger als 2000 Datensätze hat wird die Schleife halt nur einmal durchlaufen.

Nachtrag: Beide Tips getestet, Ergebnis OK - danke für den Thread!

Gruß
David

[Dieser Beitrag wurde 1 mal bearbeitet. Zuletzt am 12.02.2008 um 13:48]
Verfasst am: 04.03.2008 [14:24]
salomon_th

dabei seit: 17.10.2006
Beiträge: 5

Das (erste und zweite) Skript scheint Probleme mit PHP 5.2 zu haben. Es hagelt Warnungen in der Form:

PHP Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /[...]/class.sql_link.php on line 30
PHP Warning: Invalid argument supplied for foreach() in /[...]/db_convert.php on line 117

Er konvertiert zwar trotzdem recht viel, aber die Content-Datensätze werden durcheinander gewürfelt. Anstatt den eigentlichen Datensätzen zeigt er auf jeder Seite mehrfach einen ganz bestimmten Datensatz an. Kann das jemand mit PHP 5.2 bzw. TYPO3 4.2b3 bestätigen?

Schönen Gruß
Thomas
Verfasst am: 05.03.2008 [23:15]
davidb


dabei seit: 30.07.2006
Beiträge: 12

Ja, der Fehler liegt in der SQL-Anweisung, die durch TYPO3 übergeben werden soll.

Diese Anweisung kann durch den Admin eingegeben werden, es ist also kein Fehler von TYPO3.

Richtig muss der Wert in der localconf lauten:
Php:Zeilennummerierung:  An / Aus

  1. $TYPO3_CONF_VARS[SYS][setDBinit] = "SET NAMES utf8; CHARACTER SET utf8";

verwendet man das Install-Tool gibt man dort unter [SYS][setDBinit] den Wert SET "NAMES utf8; CHARACTER SET utf8;" einfach in das Textfeld ein.

Hier noch der entsprechende Link zur deutschen MySQL-Dokumentation: Festlegen von Zeichensätzen und Sortierfolgen

[Dieser Beitrag wurde 1 mal bearbeitet. Zuletzt am 05.03.2008 um 23:18]
Verfasst am: 07.03.2008 [13:22]
salomon_th

dabei seit: 17.10.2006
Beiträge: 5

Hi David.

davidb schrieb:

Richtig muss der Wert in der localconf lauten:
Php:Zeilennummerierung:  An / Aus

  1. $TYPO3_CONF_VARS[SYS][setDBinit] = "SET NAMES utf8; CHARACTER SET utf8";

verwendet man das Install-Tool gibt man dort unter [SYS][setDBinit] den Wert SET "NAMES utf8; CHARACTER SET utf8;" einfach in das Textfeld ein.


Das habe ich getan, laut Anleitung von oben. Habe inzwischen rausgefunden, dass es an Tabellen liegt, die keine uid-Spalte haben. Steht ja auch so im Skript *aschestreusel*.
How ever ... bis auf die Templates scheint er alles zu korrekt zu konvertieren. Aber z. B. Umlaute oder Sonderzeichen in Constants/Setup-Feld eines TS-Datensatz (Tabelle sys_templates) stellt er bockig als '?' dar. Kann das jmd. nachvollziehen? Falls nicht, hab ich meine DB schon zu oft gedumpt und wieder eingespielt und müßte die Dinge von Hand korrigieren.

Schönen Gruß,
Thomas

Nachtrag: Für das Problem mit dem einen CE, was nach der Konvertierung überall erscheint, gibt es nun auch eine Erklärung. In dem Datensatz wird eine Änderung in einer Extension beschrieben und es kommt auch PHP-Code vor. Der String
Php:Zeilennummerierung:  An / Aus

  1. $wrappedSubpartArray['###LINK_ARCHIVE###']
ist für das Kuddelmuddel verantwortlich. Lösche ich ihn raus, gehts wie das Brätzelbacken. Wieso nun gerade der String Probleme macht ist unklar, da ich an vielen Stellen PHP-Code als Doku angegeben habe. Aber damit kann man erstmal lebenicon_smile.gif

[Dieser Beitrag wurde 1 mal bearbeitet. Zuletzt am 07.03.2008 um 14:17]




 
TYPO3 Version 4.2.3 testen

TYPO3 Ver. 4.2.3 testen

Testen Sie die neue TYPO3 Version 4.2.3 kostenlos für einen Monat

Jetzt kostenlos testen

TYPO3 Schulungen

  • Berlin:
    Mit., 07.01.09 - Fre., 09.01.09
  • Köln:
    Mit., 28.01.09 - Fre., 30.01.09
  • Espelkamp:
    Mit., 18.02.09 - Fre., 20.02.09
  • Würzburg:
    Mon., 11.05.09 - Mit., 13.05.09