Antman: Probleme bei UTF-8 und str_replace()

Guten Tag Forum,

in meiner mySQL DB sind alle Daten im utf-8 codiert.
Folgende str_replace Funktion bereitet nun Ärger:

function returnContacts($public, $company_id)
{
    $search = array("ä","ü","ö","ß");
    $replace = array("ae","ue","oe","ss");

$res =& $this->_db->query("
        SELECT id,
        CONCAT(c.name_f, ' ', c.name_l) AS name,
 CONCAT(c.name_f, '_', c.name_l) AS folder
        FROM contacts c, lnk_company_contact lcc
        WHERE (c.id = lcc.id_contact)
        AND   (c.public = '".$public."')
        AND   (lcc.id_company = '".$company_id."')
        ORDER BY c.name_f");

while($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
            $row['folder'] = str_replace($search, $replace, strtolower($row['folder']));
            $employees[] = $row;
        }

return $employees;
    }

Steht in der DB ein "ä", so habe ich nach der Umwandlung ein schwarzes Viereck. Irgendwie scheint php unicode in einen anderen Zeichensatz umzuwandeln.

  1. probiers mal damit:

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

    htmlentities('string to be encoded', ENT_QUOTES, 'utf-8');
    ?>

    http://de3.php.net/manual/de/function.htmlentities.php

    gruß

    anarkist

    1. Habe das strlower() mal entfernt. Nun ist die schwarze Box weg.

      Allerdings macht folgende Funktion str_replace() GARNICHTS.

      PHP:
      $search =  array("ä", "Ä", "ü", "Ü", "ö", "Ö", "ß");
      $replace = array("ae", "ae", "ue", "ue", "oe", "o", "ss");
      $row['folder'] = str_replace($search, $replace, $row['folder']);

      Woran kann das liegen?

      1. Moin!

        Habe das strlower() mal entfernt. Nun ist die schwarze Box weg.

        Allerdings macht folgende Funktion str_replace() GARNICHTS.

        Simpel: Deine Umlaute werden nicht gefunden, weil du sie in $search nicht als UTF-8 codiert hast.

        Wenn dein Editor kein UTF-8 beherrscht, hast du es natürlich schwer, dir aus den Unicode-Tabellen und den (eigentlich recht einfachen) Umsetzungsregeln für UTF-8 die passenden Zeichen selbst raussuchen zu müssen.

        strtolower() funktioniert aus demselben Grunde nicht: Die Funktion erkennt die UTF-8-Zeichen nicht, sondern zerstört diese.

        Du solltest dich deshalb mal über die "Multibyte String Functions" informieren: http://de3.php.net/mbstring Nur mit denen hast du überhaupt eine Chance, UTF-8 in PHP zerstörungsfrei zu bearbeiten (das reine durchreichen von Strings, deren Inhalt aber nicht verändert wird, geht mit PHP auch so sehr gut).

        PHP:
        $search =  array("ä", "Ä", "ü", "Ü", "ö", "Ö", "ß");

        - Sven Rautenberg

        1. Hallo,

          nun habe ich folgende php.ini in das Verzeichnis mit den Skripten gepackt und es klappt trotzdem nicht:

          ; Set default language
          mbstring.language        = Neutral; Set default language to Neutral(UTF-8) (default)

          ;; Set default internal encoding
          ;; Note: Make sure to use character encoding works with PHP
          mbstring.internal_encoding    = UTF-8  ; Set internal encoding to UTF-8

          ;; HTTP input encoding translation is enabled.
          mbstring.encoding_translation = On

          ;; Set default HTTP input character encoding
          ;; Note: Script cannot change http_input setting.
          mbstring.http_input           = pass    ; No conversion.

          ;; Set default HTTP output character encoding
          mbstring.http_output          = pass    ; No conversion
          mbstring.http_output          = UTF-8   ; Set HTTP output encoding to UTF-8

          ;; Set default character encoding detection order
          mbstring.detect_order         = auto    ; Set detect order to auto
          mbstring.detect_order         = UTF-8, ASCII, JIS; Specify order

          1. Auf reiner sql Basis klappt es auch nicht:

            $res =& $this->_db->query("
            SELECT id,
            REPLACE(REPLACE(REPLACE(REPLACE((CONCAT(c.name_f, ' ', c.name_l)), 'ö', 'oe'), 'ü', 'ue'), 'ä', 'ae'), 'ß', 'ss') AS name,
            CONCAT(c.name_f, '_', c.name_l) AS folder
            FROM contacts c, lnk_company_contact lcc
            WHERE (c.id = lcc.id_contact)
            AND   (c.public = '".$public."')
            AND   (lcc.id_company = '".$company_id."')
            ORDER BY c.name_f");

            Aus dem gleichen Grund ?

            Wer weiß die Lösung zu beiden Problemen ?