{"id":61,"date":"2009-07-01T23:55:15","date_gmt":"2009-07-01T21:55:15","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=61"},"modified":"2016-01-12T00:09:54","modified_gmt":"2016-01-11T23:09:54","slug":"utf-8-fur-php-programmierer-und-webanwendungen","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/utf-8-fur-php-programmierer-und-webanwendungen\/","title":{"rendered":"UTF-8 f\u00fcr PHP-Programmierer und Webanwendungen"},"content":{"rendered":"<p>Keine Lust mehr auf \u00c3\u00a4\u00c3\u00b6\u251c\u0434\u251c\u2562\u00c3\u00bc\u00c3\u0178\ufffd\u0413\u00a4\u0413\u00b6as\u0413\u00b6d\u0413\u00a4? &#8211; Zeichen, die jedem geplagten Webentwickler ein Begriff sind. Hier erwartet euch eine Kurzabhandlung, wie ihr Schritt f\u00fcr Schritt den Kampf gegen das Zeichensatz-Wirrwarr gewinnt &#8211; und zwar an allen Fronten, also Dateien und Datenbank.<\/p>\n<h3>Einleitung<\/h3>\n<p>Das Allheilmittel f\u00fcr fast alle Anwendungsf\u00e4lle im Internet lautet\u00a0<strong><a href=\"http:\/\/de.wikipedia.org\/wiki\/UTF-8\">UTF-8<\/a><\/strong> und beschreibt einen\u00a0<a href=\"http:\/\/unicode.e-workers.de\/about_unicode.php\">Unicode-Zeichensatz<\/a>, der alle f\u00fcr uns relevanten Zeichen (unter anderem nat\u00fcrlich auch \u00c4,\u00d6,\u00dc und \u00df) beinhaltet. Nur der Komplett-Wechsel ist oft und gerade bei gr\u00f6\u00dferen, bereits begonnenen oder gar abgeschlossenen Webprojekten nicht ganz einfach, liegen doch oft tausende Dateien, eine bereits bef\u00fcllte Datenbank etc.pp. vor. Entities wie\u00a0<em>&amp;ouml;<\/em> (\u00f6),\u00a0<em>&amp;szlig;<\/em> (\u00df) helfen auch nicht wirklich weiter.\u00a0<strong>Gehen wir&#8217;s an: Die Komplettumstellung auf UTF-8.<\/strong><\/p>\n<h3>Was wir brauchen<\/h3>\n<ol>\n<li><a href=\"http:\/\/notepad-plus.sourceforge.net\/de\/site.htm\">Notepad++<\/a> &#8211; Ein Texteditor, der Zeichens\u00e4tze beherrscht und konvertieren kann<\/li>\n<li><a href=\"http:\/\/www.download3000.com\/download-ansi2uni-count-reg-24646.html\">Ansi2Uni<\/a> &#8211; Ein Programm zur Zeichensatz-Massenkonvertierung<\/li>\n<li>Zugriff auf phpMyAdmin<\/li>\n<\/ol>\n<h3>1) Zum Verst\u00e4ndnis: Der Byte-Order-Mark<\/h3>\n<p><div id=\"attachment_62\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/php-header.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-62\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/php-header-150x150.jpg\" alt=\"PHP Header\" title=\"PHP Header\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-62\" \/><\/a><p id=\"caption-attachment-62\" class=\"wp-caption-text\">PHP Header<\/p><\/div><br \/>\nPHP-Entwickler m\u00fcssen oft\u00a0<a href=\"http:\/\/de.php.net\/header\">Header<\/a> setzen, um dem Server vor dem interpretieren der Datei Informationen \u00fcber die Datei zu geben. Da bei UTF8 allerdings ganz am Anfang der Datei ein\u00a0<em>BOM<\/em> (<a href=\"http:\/\/www.scriptblogger.de\/byte-order-mark-in-utf-8-kodierten-php-dateien-132.html\">Byte Order Mark<\/a>, bestehend aus ein paar Bits) gesetzt wird, um dem Webserver mitzuteilen, dass es sich um eine UTF8-codierte Datei handelt, hei\u00dft es beim setzen des headers per PHP\u00a0<strong>Cannot modify header information &#8211; headers already sent<\/strong> &#8211; bl\u00f6d.<\/p>\n<p>Es wird n\u00e4mlich erwartet, dass der header als erstes gesetzt wird, und da ist ja nun schon der BOM.\u00a0<strong>Abhilfe schafft das Entfernen des BOM&#8217;s.<\/strong>Dann m\u00fcssen wir dem Webserver zwar im Nachhinein mitteilen, dass es sich um UTF-8 handelt, die Datei selbst ist aber richtig codiert. Wie das geht im n\u00e4chsten Schritt.<\/p>\n<h3>2) Der Texteditor<\/h3>\n<p><div id=\"attachment_63\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-generalumstellung.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-63\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-generalumstellung-150x150.jpg\" alt=\"Notepad++\" title=\"Notepad++\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-63\" \/><\/a><p id=\"caption-attachment-63\" class=\"wp-caption-text\">Notepad++<\/p><\/div><br \/>\nDas Windows-Notepad ist ungeeignet, da es standardm\u00e4\u00dfig im\u00a0<strong>ANSI-Zeichensatz (ISO)<\/strong> und nicht in\u00a0<strong>Unicode (UTF)<\/strong> speichert. Um in Zukunft das Zeichensatzchaos zu vermeiden, stellen wir das eben gedownloadete\u00a0<em>Notepad++<\/em> gleich auf\u00a0<strong>UTF-8 (ohne (!) BOM)<\/strong> um.<\/p>\n<p><strong>Vorgehen:<\/strong> Einstellungen -> Einstellungen -> Reiter &#8222;Neues Dokument&#8220; -> Kodierung: UTF-8 ohne BOM. Dabei k\u00f6nnt Ihr gleich auch noch unter &#8222;Format&#8220;\u00a0<em>Unix<\/em> ausw\u00e4hlen. Unix versieht Zeilenenden nur mit einem\u00a0<em>\\n<\/em>, Windows verwendet\u00a0<em>\\r\\n<\/em>. Da in der Regel Apache-Systeme als Webserver zum Einsatz kommen, wollen wir gleich in der Unix-Welt bleiben ;-).<\/p>\n<p>Die aktuelle Codierung der Datei seht ihr in der rechten unteren Ecke.\u00a0<a href=\"https:\/\/d-mueller.de\/hpdata\/images\/screens\/anzeige.jpg\">Ansi as UTF8<\/a> bedeutet hierbei\u00a0<strong>UTF8 ohne BOM<\/strong>. Konvertieren k\u00f6nnt ihr Dateien per &#8222;Format&#8220;.\u00a0<strong>Wichtig:<\/strong> Nie einfach den Zeichensatz verstellen, immer konvertieren &#8211; nur so bleiben die Umlaute erhalten &#8211; aber dazu sp\u00e4ter.<\/p>\n<h3>3) Die Konvertierung der Dateien<\/h3>\n<p><div id=\"attachment_64\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/konvertierung.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-64\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/konvertierung-150x150.jpg\" alt=\"Konvertierung\" title=\"Konvertierung\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-64\" \/><\/a><p id=\"caption-attachment-64\" class=\"wp-caption-text\">Konvertierung<\/p><\/div><br \/>\nJetzt habt ihr dummerweise schon haufenweise Dateien vorliegen, die eben\u00a0<strong>nicht<\/strong> einheitlich in\u00a0<strong>UTF8 ohne BOM<\/strong> codiert sind. Eine Variante w\u00e4re jetzt, die von Notepad++ angebotene Funktion wie beschrieben per\u00a0<em>&#8222;Format -> Konvertiere zu UTF8 ohne BOM&#8220;<\/em> anzuwenden, allerdings w\u00e4re das bei vielen Dateien eine echte Sisyphos-Arbeit.<\/p>\n<p>Sollten bei euch einheitlich alle Dateien in\u00a0<em>ANSI<\/em> codiert sein, k\u00f6nnt ihr aufatmen: Mit oben angesprochene und unten beschriebenen Minitool\u00a0<em>Ansi2Uni<\/em> sind\u00a0<strong>Massenkonvertierungen<\/strong> von Zeichens\u00e4tzen m\u00f6glich.<\/p>\n<h4>Vorgehensweise Massenkonvertierung in UTF8<\/h4>\n<div id=\"attachment_65\" style=\"width: 256px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/ansi2uni.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-65\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/ansi2uni.jpg\" alt=\"ansi2uni\" title=\"ansi2uni\" width=\"246\" height=\"288\" class=\"size-full wp-image-65\" \/><\/a><p id=\"caption-attachment-65\" class=\"wp-caption-text\">ansi2uni<\/p><\/div>\n<p><strong>Wichtig: Vor der Verwendung des Programms erst diesen kompletten Abschnitt lesen!<\/strong><\/p>\n<ol>\n<li><strong>From codepage:<\/strong> Hier muss eingestellt werden, was der aktuelle Zeichensatz der vorliegenden Dateien ist. Dummerweise m\u00fcssen alle zu konvertierenden Dateien einheitlich den hier anzugebenden Zeichensatz haben, sonst gehen entweder die enthaltenen Sonderzeichen kaputt oder die Datei wird ignoriert. Sicherheitshalber hier also ein Backup erstellen oder &#8211; so weh es tut &#8211; wirklich alle Dateien per Hand mit Notepad++\u00a0<em>sicher<\/em> konvertieren. Wenn allerdings fl\u00e4chendeckend\u00a0<strong>ANSI<\/strong> (iso-8859-1) verwendet wird, dann k\u00f6nnt Ihr das Programm beruhigt einsetzen, denn iso-8859-1\tentspricht hier der\u00a0<a href=\"http:\/\/de.wikipedia.org\/wiki\/Codepage\">Codepage<\/a> 1252.<\/li>\n<li><strong>Select file(s) \/ Dir(s):<\/strong> Selbsterkl\u00e4rend. Hier w\u00e4hlt ihr das Verzeichnis aus, welches die ganzen zu konvertierenden Dateien beinhaltet<\/li>\n<li><strong>File mask:<\/strong> Leider k\u00f6nnen hier nicht mehrere zu konvertierende Formate aneinandergeh\u00e4ngt werden (etwa *.php,*.css). So muss jedes Dateiformat einzeln durchlaufen werden.\u00a0<strong>Wichtig:<\/strong> Auf keinen Fall den * (alle Dateien) stehen lassen, da so auch Bilder und andere Dateien zu UTF8 konvertiert werden und dabei kaputt gehen.<\/li>\n<li><strong>To:<\/strong> Wie oben beschrieben nehmen wir UTF-8 (no BOM)<\/li>\n<li><strong>Overwrite old files:<\/strong> Wenn ihr diese Option anhakt, werden die existierenden Dateien \u00fcberschrieben (vorher Backup machen!), sonst m\u00fcsst ihr ein neues Verzeichnis f\u00fcr die konvertierten Dateien ausw\u00e4hlen<\/li>\n<li><strong>Recursive:<\/strong> Ausw\u00e4hlen, denn nur so werden auch alle Unterordner erfasst.<\/li>\n<\/ol>\n<h3>4) Die Feinarbeit<\/h3>\n<p><div id=\"attachment_66\" style=\"width: 160px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/firefox-anzeige.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-66\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/firefox-anzeige-150x150.jpg\" alt=\"Firefox-charset\" title=\"Firefox-charset\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-66\" \/><\/a><p id=\"caption-attachment-66\" class=\"wp-caption-text\">Firefox-charset<\/p><\/div><br \/>\n<div id=\"attachment_67\" style=\"width: 255px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/anzeige.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-67\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/anzeige.jpg\" alt=\"Charset-Anzeige\" title=\"Charset-Anzeige\" width=\"245\" height=\"57\" class=\"size-full wp-image-67\" \/><\/a><p id=\"caption-attachment-67\" class=\"wp-caption-text\">Charset-Anzeige<\/p><\/div><br \/>\nJetzt liegen also die Datei schonmal in der korrekten Speicherung vor! Exemplarisch\u00a0<strong>\u00fcberpr\u00fcfen<\/strong> k\u00f6nnt ihr das, indem ihr stichprobenartig mit Notepad++ konvertierte Dateien ausw\u00e4hlt und in die rechte untere Ecke schaut. Das sollte dem Screenshot rechts entsprechen.<\/p>\n<p>Da der Browser aber bei der automatichen Erkennung der Dateicodierung ohne den\u00a0<em>Byte Order Mark<\/em> Probleme bekommen kann, sollten wir ihm auch in der Datei selbst noch mitteilen, dass es sich um\u00a0<strong>UTF-8<\/strong> handelt. Das geht bei\u00a0<strong>HTML, PHP&#8230;<\/strong>-Dateien per Metatag<\/p>\n<pre data-enlighter-language=\"html\" class=\"EnlighterJSRAW\">\r\n&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html; charset=utf-8&quot; \/&gt;\r\n<\/pre>\n<p>(im <em>head<\/em>-Bereich der Seite unterzubringen) und bei PHP-Dateien zus\u00e4tzlich noch mit dem Header<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;?php header( &#039;content-type: text\/html; charset=utf-8&#039; ); ?&gt;\r\n<\/pre>\n<p>ganz am Anfang des Dokuments (gibt ja dank unseres Verzichts auf den BOM auch keine Probleme mehr). Bei <em>CSS-Dateien<\/em> wird in die erste Zeile ein<\/p>\n<pre data-enlighter-language=\"css\" class=\"EnlighterJSRAW\">\r\n@charset &quot;utf-8&quot;;\r\n<\/pre>\n<p>gesetzt &#8211; fertig. <strong>Javascript<\/strong> ben\u00f6tigt keine explizite Deklaration.<\/p>\n<p>Welchen Charset der Browser aktuell verwendet, l\u00e4sst sich im Firefox per\u00a0<em>Rechtsklick -> Seiteninformationen anzeigen<\/em> <strong>(siehe Screenshot links)<\/strong> und im IE7 per\u00a0<em><a href=\"https:\/\/d-mueller.de\/hpdata\/images\/screens\/ie7-anzeige.jpg\">Ansicht -> Codierung<\/a><\/em>erfahren. Um ganz sicher zu gehen, setzen wir aber noch einen drauf.<\/p>\n<h3>5) Der Webserver<\/h3>\n<p>Auch dem Webserver k\u00f6nnen wir nochmal explizit mitteilen, dass er alle relevanten Dateien in UTF-8 ausliefern soll. Dazu erstellen wir eine Datei mit dem Namen\u00a0<strong>.htaccess<\/strong> (Charset ist hier zwar egal, konsequenterweise sollte es aber auch\u00a0<em>UTF8<\/em> sein) und dem Inhalt<\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">\r\nAddCharset utf-8 .css .htm .html .js\r\nphp_value default_charset utf-8\r\n<\/pre>\n<p>und laden diese in das Hauptverzeichnis des Servers hoch, also direkt in die &#8222;Wurzel&#8220;. Da Dateinamen unter Windows nicht mit einem Punkt beginnen d\u00fcrfen, k\u00f6nnt Ihr die Datei dann auch erst auf dem Server umbenennen. Jetzt werden alle Dateien mit den Endungen in der ersten Reihe\u00a0<strong>(beliebig zu erg\u00e4nzen, etwa .xml&#8230;)<\/strong> in UTF8 interpretiert. F\u00fcr PHP muss die zweite Zeile zus\u00e4tzlich ran, da die Definition der ersten Reihe f\u00fcr\u00a0<strong>.php<\/strong>-Dateien keine G\u00fcltigkeit hat. Dieser Schritt ist zwar &#8222;doppelt gemoppelt&#8220;, aber das h\u00e4lt ja bekanntlich besser ;).<\/p>\n<h3>6) Die Datenbank<\/h3>\n<p>Die Datenbank und Ihre ganzen Parameter w\u00e4ren nochmal ein Kapitel f\u00fcr sich. Um auch hier radikal aufzur\u00e4umen und nur noch UTF-8 zu verwenden,\u00a0<em>Backuppen<\/em> wir die Datenbank,<em>l\u00f6schen<\/em> anschlie\u00dfend alle Tabellen,\u00a0<em>konvertieren<\/em> das Backup in UTF-8 und\u00a0<em>erstellen<\/em> die Datenbank wieder neu &#8211; wesentlich einfacher, als mit Spezialtools und Scripten eine Konvertierung des laufenden Datenbestandes erreichen zu wollen.<\/p>\n<h4>Schritt 1: Datenbank backuppen<\/h4>\n<p><div id=\"attachment_68\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-exportieren.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-68\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-exportieren-150x150.jpg\" alt=\"PhpMyAdmin Export\" title=\"PhpMyAdmin Export\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-68\" \/><\/a><p id=\"caption-attachment-68\" class=\"wp-caption-text\">PhpMyAdmin Export<\/p><\/div><br \/>\nDie zu exportierende Datenbank in phpMyAdmin ausw\u00e4hlen und oben den Reiter &#8222;Exportieren&#8220; anw\u00e4hlen. Wichtig hierbei ist, dass alle Tabellen der Datenbank ausgew\u00e4hlt sind. Sonst k\u00f6nnen in der Regel alle Voreinstellungen belassen werden. Zur Sicherheit rechts ein Screenshot, wie es aussehen sollte.<\/p>\n<p>Nun erstellen wir eine\u00a0<em>backup.sql<\/em>-Datei, \u00f6ffnen diese mit Notepad++ und kopieren der Inhalt der Textarea aus phpMyAdmin (das Datenbankbackup incl. aller in der Datenbank enthaltetenen Daten) in diese Datei hinein. Das kann bei gro\u00dfen Datenbanken etwas dauern.<\/p>\n<h4>Schritt 2: Backup anpassen<\/h4>\n<p>Hier ein Beispiel-Ausschnitt aus dem SQL-Code des erstellten Backups:<\/p>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nCREATE TABLE IF NOT EXISTS `g2_AccessMap` (\r\n`g_accessListId` int(11) NOT NULL default &#039;0&#039;,\r\n`g_userOrGroupId` int(11) NOT NULL default &#039;0&#039;\r\n) ENGINE=MyISAM DEFAULT CHARSET=LATIN1;\r\n<\/pre>\n<p>Das\u00a0<code>CHARSET=LATIN1<\/code> st\u00f6rt uns, gibt es doch den ANSI-Zeichensatz\u00a0<strong>iso-8859-1<\/strong> vor. Richtig w\u00e4re hier\u00a0<strong>UTF8<\/strong>. Also (was auch immer bei euch unter Charset eingetragen sein sollte): Suchen und Ersetzen\u00a0<em>(Strg+H)<\/em> und alle Vorkommen des &#8222;anderen&#8220; Zeichensatzes in UTF8 ab\u00e4ndern, sodass am Ende alle &#8222;CREATE TABLE&#8220;-Anweisungen nach folgendem Schema aussehen:<\/p>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nCREATE TABLE IF NOT EXISTS Tabellenname (\r\n[...]\r\n) ENGINE=MyISAM DEFAULT CHARSET=UTF8;\r\n<\/pre>\n<h4>Schritt 3: Backup konvertieren<\/h4>\n<p>Nun\u00a0<strong>konvertieren<\/strong> wir die\u00a0<em>backup.sql<\/em> zu UTF-8 (also nicht\u00a0<em>&#8218;ohne BOM&#8216;<\/em>, sondern\u00a0<em>normal<\/em> UTF-8). Das sollte nun zusammen mit dem vorangegangenen Schritt etwa so aussehen:<br \/>\n<div id=\"attachment_69\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-dump.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-69\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-dump-300x215.jpg\" alt=\"Notepad Dump\" title=\"Notepad Dump\" width=\"300\" height=\"215\" class=\"size-medium wp-image-69\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-dump-300x215.jpg 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/notepad-dump.jpg 830w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-69\" class=\"wp-caption-text\">Notepad Dump<\/p><\/div><\/p>\n<h4>Schritt 4: phpMyAdmin konfigurieren<\/h4>\n<p>Zur\u00fcck in phpMyAdmin\u00a0<strong>leeren<\/strong> wir erstmal die Datenbank. In der Tabellen\u00fcbersicht unten klicken wir\u00a0<em>&#8222;Alle ausw\u00e4hlen&#8220;<\/em> und\u00a0<em>&#8222;markierte l\u00f6schen&#8220;<\/em> &#8211; keine Angst, wir haben ja das Backup.<br \/>\n<div id=\"attachment_70\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-tabellen-loeschen.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-70\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-tabellen-loeschen-300x231.jpg\" alt=\"PhpMyAdmin Tabellen l\u00f6schen\" title=\"PhpMyAdmin Tabellen l\u00f6schen\" width=\"300\" height=\"231\" class=\"size-medium wp-image-70\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-tabellen-loeschen-300x231.jpg 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-tabellen-loeschen-1024x791.jpg 1024w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-tabellen-loeschen.jpg 1068w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-70\" class=\"wp-caption-text\">PhpMyAdmin Tabellen l\u00f6schen<\/p><\/div><br \/>\nIn der jetzt jungfr\u00e4ulichen Datenbank verstellen wir im Reiter\u00a0<em>&#8222;Operationen&#8220;<\/em> die\u00a0<em>Kollation<\/em> (Sortierreihenfolge) der Datenbank auf\u00a0<strong>utf8_unicode_ci<\/strong>.<\/p>\n<div id=\"attachment_71\" style=\"width: 263px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/kollation.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-71\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/kollation-253x300.jpg\" alt=\"Kollation\" title=\"Kollation\" width=\"253\" height=\"300\" class=\"size-medium wp-image-71\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/kollation-253x300.jpg 253w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/kollation.jpg 320w\" sizes=\"auto, (max-width: 253px) 100vw, 253px\" \/><\/a><p id=\"caption-attachment-71\" class=\"wp-caption-text\">Kollation<\/p><\/div>\n<p>Jetzt gehen wir wieder ins &#8222;Hauptmen\u00fc&#8220; von phpMyAdmin (auf das Logo links oben klicken) und w\u00e4hlen bei\u00a0<em>&#8222;Zeichensatz \/ Kollation der mySQL-Verbindung&#8220;<\/em> ebenfalls\u00a0<strong>utf8_unicode_ci<\/strong> &#8211; Damit sind die Grundeinstellungen angepasst. Viel mehr k\u00f6nnen wir nicht tun.<\/p>\n<div id=\"attachment_72\" style=\"width: 310px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpMyadmin-einstellungen.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-72\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpMyadmin-einstellungen-300x294.jpg\" alt=\"PhpMyAdmin Einstellungen\" title=\"PhpMyAdmin Einstellungen\" width=\"300\" height=\"294\" class=\"size-medium wp-image-72\" srcset=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpMyadmin-einstellungen-300x294.jpg 300w, https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpMyadmin-einstellungen.jpg 507w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-72\" class=\"wp-caption-text\">PhpMyAdmin Einstellungen<\/p><\/div>\n<h4>Schritt 5: Backup zur\u00fcckspielen<\/h4>\n<p><div id=\"attachment_73\" style=\"width: 160px\" class=\"wp-caption alignright\"><a href=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-importieren.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-73\" src=\"https:\/\/d-mueller.de\/blog\/wp-content\/uploads\/2010\/10\/phpmyadmin-importieren-150x150.jpg\" alt=\"PhpMyAdmin importieren\" title=\"PhpMyAdmin importieren\" width=\"150\" height=\"150\" class=\"size-thumbnail wp-image-73\" \/><\/a><p id=\"caption-attachment-73\" class=\"wp-caption-text\">PhpMyAdmin importieren<\/p><\/div><br \/>\nNun w\u00e4hlen wir wieder unsere jetzt leere Datenbank aus, klicken oben auf den Reiter\u00a0<em>&#8222;Importieren&#8220;<\/em> und w\u00e4hlen unser eben erstelltes Datenbankbackup\u00a0<em>backup.sql<\/em>. Nat\u00fcrlich wird bei\u00a0<em>&#8222;Zeichencodierung der Datei&#8220;<\/em> <strong>utf8<\/strong> ausgew\u00e4hlt. Bei gro\u00dfen Datenbankbackups k\u00f6nnte es nun etwas dauern &#8211; falls es gar zu einem Abbruch kommen sollte, m\u00fcssen Spezialtools wie der\u00a0<a href=\"http:\/\/www.mysqldumper.de\/\">mysqlDumper<\/a> zum Einsatz kommen. Das f\u00fchrt jetzt hier aber zu weit. Nun k\u00f6nnen wir auf\u00a0<strong>&#8222;OK&#8220;<\/strong> klicken und hoffen, dass alles gut geht<\/p>\n<h4>Der Fall der F\u00e4lle<\/h4>\n<p>Falls die Umlaute immernoch &#8222;schr\u00e4g&#8220; ankommen sollten, kann es sein, dass phpMyAdmin quer schie\u00dft. Falls das der Fall sein sollte, ist der letzte &#8222;Rettungsstrick&#8220; direkt nach der Verbindung zur Datenbank<\/p>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nmysql_query(&quot;SET NAMES &#039;UTF8&#039;&quot;);\r\n<\/pre>\n<p>auszuf\u00fchren, sodass es bei euch ungef\u00e4hrt so aussieht:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n\/\/connect\r\n$connectionid = @mysql_connect ($host,$user,$pw);\r\nmysql_select_db ($db, $connectionid);\r\nmysql_query(&quot;SET NAMES &#039;UTF8&#039;&quot;);\r\n<\/pre>\n<h3>Ende<\/h3>\n<p>Bei Kritik und Anmerkungen zu diesem kurzen Abriss bitte ich um eine <a href=\"mailto:mueller.dav@gmail.com\">e-Mail<\/a>. Nochmal sei auf besondere Vorsicht im Umgang mit dem beschriebenen Programm Ansi2uni hingewiesen, da nicht in der angegebenen &#8222;Codepage&#8220; codierte Dateien und sensible Formate wie Bilder oder Zip-Dateien der UTF8-Konvertierung zum Opfer fallen.<\/p>\n<h3>Update<\/h3>\n<p>Wie Gabriel per <a href=\"https:\/\/d-mueller.de\/blog\/utf-8-fur-php-programmierer-und-webanwendungen\/#comment-868\">Kommentar<\/a> dankenswerterweise noch erg\u00e4nzt hat: Auf PHP-Seite m\u00fcssen f\u00fcr die ultimative &#8222;UTF8-Experience&#8220; die <a href=\"http:\/\/php.net\/manual\/en\/book.mbstring.php\">Multibyte-Stringfunktionen (mbstring)<\/a> statt der Standard-Stringfunktionen verwendet werden. Hierzu ist es zum Gl\u00fcck nicht n\u00f6tig, alle Vorkommen von <i>substr, strlen<\/i> etc. mit ihren Multibyte-Pendants h\u00e4ndisch zu ersetzen: Durch die php.ini &#8211; Einstellung <\/p>\n<pre data-enlighter-language=\"enlighter\" class=\"EnlighterJSRAW\">mbstring.func_overload = 7<\/pre>\n<p> lassen sich alle Standard-Stringfunktionen <a href=\"http:\/\/php.net\/manual\/en\/mbstring.overload.php\">\u00fcberladen<\/a>. Wichtig: Mit <i>ini_set<\/i> ist es hierbei nicht getan, f\u00fcrs \u00dcberladen ist zwingend eine \u00c4nderung der <a href=\"http:\/\/ch.php.net\/manual\/de\/mbstring.configuration.php\">php.ini n\u00f6tig<\/a>. In diesem Zuge m\u00f6chte ich auch noch auf meinen Post <a href=\"https:\/\/d-mueller.de\/blog\/php-wtf-7\/\">PHP WTF #7<\/a> hinweisen, mit dessen Hilfe sich sch\u00f6n testen l\u00e4sst, ob das \u00dcberladen durch die Multibyte-Funktionen erfolgreich war:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n&lt;meta charset=&quot;utf8&quot;&gt;\r\n&lt;?php\r\nmb_internal_encoding(&quot;utf-8&quot;);\r\n$a = &#039;\u00e4a&#039;;\r\necho &quot;substr 0,1: &quot; . substr($a, 0, 1);\r\n<\/pre>\n<p>Der Output vor dem Setzen von <b>mbstring.func_overload = 7<\/b>: \ufffd &#8211; und danach wie erwartet <i>\u00e4<\/i>. Hierbei weisen wir die \u00fcberladenen mbstring-Funktionen mittels <a href=\"http:\/\/php.net\/manual\/de\/function.mb-internal-encoding.php\">mb_internal_encoding<\/a> auch gleich noch darauf hin, dass wir gern UTF-8 verwenden m\u00f6chten. In diesem Zusammenhang muss auch noch die <a href=\"http:\/\/php.net\/manual\/de\/function.iconv.php\">iconv<\/a>-Funktion erw\u00e4hnt werden, die PHP ebenfalls zum Multibyte-Handling erzieht. Danke an franc f\u00fcr den Hinweis per E-Mail!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Keine Lust mehr auf \u00c3\u00a4\u00c3\u00b6\u251c\u0434\u251c\u2562\u00c3\u00bc\u00c3\u0178\ufffd\u0413\u00a4\u0413\u00b6as\u0413\u00b6d\u0413\u00a4? &#8211; Zeichen, die jedem geplagten Webentwickler ein Begriff sind. Hier erwartet euch eine Kurzabhandlung, wie ihr Schritt f\u00fcr Schritt den Kampf gegen das Zeichensatz-Wirrwarr gewinnt &#8211; und zwar an allen Fronten, also Dateien und Datenbank. &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/utf-8-fur-php-programmierer-und-webanwendungen\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,9,3],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","hentry","category-php","category-datenbanken","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}