strtolower auch für UTF-Sonderzeichen

Das Problem: Ein beliebiger String soll kleingeschrieben werden.

Unsere Funktion dazu:

$sMyString = strtolower(trim($sMyString));

Das funktionierte aber plötzlich für einen String nicht mehr, das große Ö blieb ein großes Ö, also debuggen und siehe da, im Zend Debugger stellt sich das Ö als Viereck dar –> Hinweis auf ein Somderzeichen. Es war auch wirklich kein ASCII-Ö, sondern ein UTF8-Ö (komm da erstmal drauf).

Die Lösung: Es wird die Multibyte-Variante von strtolower benutzt:

$sMyString = mb_strtolower(trim($sMyString));

Vorher allerdings drauf achten, dass euer Projekt auch wirklich UTF-8 geeignet ist.

Dazu

  • Datei als UTF-8 speichern
  • Charset UTF-8 einstellen
  • Die mysql-connect’s auf UFT-8 einstellen, dies geht so

// mysql_connect

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");

// query ausführen

Diesen Code nach dem mysql_connect und der ersten Abfrage ausführen, dann hat man alle Daten als UTF-8.

Ach ja, und natürlich auch die Datenbank-Tabellen in einem geeigneten Charset speichern 😉

7 Gedanken zu „strtolower auch für UTF-Sonderzeichen

  1. Jan

    > Ach ja, und natürlich auch die Datenbank-Tabellen UTF-8 speichern

    Das ist übrigens nicht korrekt. Lediglich die Verbindung muss utf-8 sein. Wenn die Daten bei MySQL ankommen, werden sie entsprechend dem charset/collation des Feldes konvertiert.

    Antworten
  2. Sascha Presnac

    @Jan: Gelesen und verstanden, dazu nur: In _meinem_ Fall war das Ö kein ASCII-Ö, sondern ein UTF8-Ö, dass keine ASCII entsprechung hat (also anders wie in dem Artikel den du referenzierst); kurz: Das Ö war gar kein Ö, sondern irgendwas anderes. Zur Lösung musste eben auch die DB-Tabelle auf UFT-8 umgestellt werden, damit alles reibungslos lief.

    Antworten
  3. Jan

    Ok, ASCII 😉 Aber die Aussage, dass man charset/collation auf utf-8 umstellen muss, ist trotzdem nicht korrekt. Es kann genauso gut latin1 sein. Wenn man deutsche Inhalte speichert, sollte man das sogar machen. Denn erstens verbraucht es weniger Speicher und zweites wird dann korrekt sortiert.

    Antworten

Schreibe einen Kommentar zu Jan Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert