Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

MySQL PHP Umlaute/Sonderzeichen fixen UTF-8/ISO

Jeder kennt das Problem, aus irgendeinem Grund wurden Wörter in der falschen Kodierung in die Datenbank geschrieben. Wenn das passiert ist, kann man daran erkennen, dass sich Zeichen wie diese untergemischt haben:

'¦, '¨, '?, '´, '¸, 'À, 'Á, 'Â, 'Ã, 'Ä, 'Å, 'Æ, 'Ç, 'È, 'É, 'Ê, 'Ë,
'Ì, 'Í, 'Î, 'Ï, 'Ñ, 'Ò, 'Ó, 'Ô, 'Õ, 'Ö, 'Ø, 'Ù, 'Ú, 'Û, 'Ü, 'Ý, 'Þ,
'ß, 'à, 'á, 'â, 'ã, 'ä, 'å, 'æ, 'ç, 'è, 'é, 'ê, 'ë, 'ì, 'í, 'î,
'ï, 'ð, 'ñ, 'ò, 'ó, 'ô, 'õ, 'ö, 'ø, 'ù, 'ú, 'û, 'ý, 'þ, 'ÿ

Das Problem ist, dass diese Zeichen nicht utf8 kodiert worden sind, aber in utf8 dargestellt worden sind, was eine Vielzahl an Gründen haben kann.

Iso-kodierte Strings nach UTF-8 umwandeln

Um dies zu vermeiden, sollte also vorher die Funktion

$string = utf8_encode($string);

angewendet werden.

Überprüfung der Kodierung

Die Kodierung von Strings kann überprüft werden mit der Funktion mb_detect_encoding.

echo mb_detect_encoding($string);

Für einen Quick and Dirty Fix kann man folgende Lösung nehmen:

if(mb_detect_encoding($string)!= 'UTF-8'){ 
$string= utf8_encode($string);
}

Ändern der Datenbankverbindungs-Kodierung

Eine weitere Fehlerquelle, ist die Übertragung der Daten zur Datenbank, diese sollte immer einmalig nach dem Öffnen der Datenbankverbindung auf UTF-8 gesetzt werden:

...
mysql_connect();
mysql_query("SET NAMES 'utf8'");

Laden von UTF-8 kodierten PHP Dateien in ein ISO-kodiertes Projekt

Wenn ausversehen UTF-8 kodierte PHP-Dateien geladen werden, kann es vorkommen, dass die Kodierung trotz aller Mühe auf UTF-8 umgestellt wird.

Dann hilft folgendes:

require_once "utf-8.php"
header('Content-Type: text/html;
charset=ISO-8859-1');

Hilfsfunktion um Arrays nach UTF-8 zu kodieren

Eine einfache rekursive Funktion um ein mehrdimensionales Array nach UTF-8 zu kodieren ist (performanter wäre noch mit Referenzen zu arbeiten):

function utf8encodeArray($array)
{
        foreach($array as $key =>  $value)
        {
            if(is_array($value))
            {
                $array[$key] = utf8encodeArray($value);
            }
            elseif(!mb_detect_encoding($value, 'UTF-8', true))
            {
                $array[$key] = utf8_encode($value);
            }
        }
}

Update: eine einfachere Funktion zum dynamischen kodieren von Arrays:

function encodeArray(array $array, string $sourceEncoding, string $destinationEncoding = 'UTF-8'): array
{
    if($sourceEncoding === $destinationEncoding){
        return $array;
    }

    array_walk_recursive($array,
        function(&$array) use ($sourceEncoding, $destinationEncoding) {
            $array = mb_convert_encoding($array, $destinationEncoding, $sourceEncoding);
        }
    );

    return $array;
}

Der Header

Es sollte auch kontrolliert werden, ob der Header des HTML Dokuments auf UTF8 gesetzt worden ist:

<head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 </head>

oder mit PHP

header ('Content-type: text/html; charset=utf-8');

Datei-Kodierung

Die Codierung der PHP Datei muss auch UTF-8 sein, sonst werden Umlaute auch falsch dargestellt (kann z.B. mit Notepad++ überprüft und verändert werden: Hauptmenü->Kodierung->UTF-8 ). In jede gute IDE kann die Kodierung für ein ganzes Projekt voreingestellt werden.

Andere Fehlerquellen

Man kann die Kodierung eines Strings oder Dokuments auf vielfältige Weise verlieren. Besonders heimtückisch sind PHP Funktionen zur String-Manipulation, die den String automatisch nach UTF8 umwandeln und zurückgeben, was ein Problem darstellt, wenn die Webseite in ISO-8859-1 codiert ist. Leider habe ich die Funktionen nicht mehr gefunden, ich würde mich sehr freuen über Feedback zu dem Thema.

Wenn es bereits zu spät ist und die Daten in der DB gespeichert worden sind, kann man die falschen Umlaute wie folgt ersetzen:

private function getUmlauteArray() { return array( 'ü'=>'ü', 'ä'=>'ä', 'ö'=>'ö', 'Ö'=>'Ö', 'ß'=>'ß', 'à '=>'à', 'á'=>'á', 'â'=>'â', 'ã'=>'ã', 'ù'=>'ù', 'ú'=>'ú', 'û'=>'û', 'Ù'=>'Ù', 'Ú'=>'Ú', 'Û'=>'Û', 'Ãœ'=>'Ü', 'ò'=>'ò', 'ó'=>'ó', 'ô'=>'ô', 'è'=>'è', 'é'=>'é', 'ê'=>'ê', 'ë'=>'ë', 'À'=>'À', 'Á'=>'Á', 'Â'=>'Â', 'Ã'=>'Ã', 'Ä'=>'Ä', 'Ã…'=>'Å', 'Ç'=>'Ç', 'È'=>'È', 'É'=>'É', 'Ê'=>'Ê', 'Ë'=>'Ë', 'ÃŒ'=>'Ì', 'Í'=>'Í', 'ÃŽ'=>'Î', 'Ï'=>'Ï', 'Ñ'=>'Ñ', 'Ã’'=>'Ò', 'Ó'=>'Ó', 'Ô'=>'Ô', 'Õ'=>'Õ', 'Ø'=>'Ø', 'Ã¥'=>'å', 'æ'=>'æ', 'ç'=>'ç', 'ì'=>'ì', 'í'=>'í', 'î'=>'î', 'ï'=>'ï', 'ð'=>'ð', 'ñ'=>'ñ', 'õ'=>'õ', 'ø'=>'ø', 'ý'=>'ý', 'ÿ'=>'ÿ', '€'=>'€' );
public function fixeUmlauteDb() { 
$umlaute = $this->getUmlauteArray(); foreach ($umlaute as $key => $value)
{
$sql = "UPDATE table SET tracks = REPLACE(row, '{$key}', '{$value}') WHERE row LIKE '%{$key}%'"; 
} 
}

Achtung: Das Script funktioniert nur, wen die Codierung der PHP Datei UTF-8 ist (kann z.B. mit Notepad++ gecheckt/verändert werden: Hauptmenü->Kodierung->UTF-8 ).