mixmastertobsi: php substr Umlaute-Problem

Hallo, ich habe ein PHP substr Umlaute-Problem.

Folgendes Szenarium - Ich möchte zum Beispiel das Wort "Häußler" auf die ersten zwei Buchstaben kürzen (UTF8), allerdings bekomme ich hier als Ergebnis string(2) "H�".

$wort = "Häußler";
$wort = substr($wort,0,2);
var_dump($wort);

Wenn ich substr($wort,0,3) mache, bekomme ich es korrekt dargestellt, allerdings wären es ja nun 3 Buchstaben, wenn ich zum Beispiel einen anden Namen, wie "Moser", mit zwei Buchstaben darstellen möchte.

akzeptierte Antworten

  1. Tach!

    Hallo, ich habe ein PHP substr Umlaute-Problem.

    substr() und andere ähnliche PHP-Funktionen arbeiten byteorientiert. Sie sind für UTF-8 nicht oder nur sehr bedingt geeignet. Die Multibyte-String-Funktionen können stattdessen verwendet werden. Beachte, dass da auch noch eine Initialisierung stattfinden muss, bei der die verwendete Zeichenkodierung eingestellt wird.

    dedlfix.

    1. @@dedlfix

      substr() und andere ähnliche PHP-Funktionen arbeiten byteorientiert. Sie sind für UTF-8 nicht oder nur sehr bedingt geeignet.

      ?? Was wäre denn Bedingungen, unter denen sie geeignet wären?

      Die Multibyte-String-Funktionen können stattdessen verwendet werden.

      s/können/sollten/

      LLAP 🖖

      --
      “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
      1. Tach!

        substr() und andere ähnliche PHP-Funktionen arbeiten byteorientiert. Sie sind für UTF-8 nicht oder nur sehr bedingt geeignet.

        ?? Was wäre denn Bedingungen, unter denen sie geeignet wären?

        Wenn die Kodierung keine Rolle spielt, lassen sich einige weiterhin verwenden. Z.B. strtr() in der zweiten Variante oder trim()/explode()/implode() mit Zeichen aus dem ASCII-Bereich. Es gibt ja nicht für alle Funktionen einen mb-Ersatz.

        dedlfix.

        1. Hallo,

          Wenn die Kodierung keine Rolle spielt,

          Wenn die NICHT-Kodierung eine Rolle spielt, muss man sie auch noch weiterhin verwenden.

          LG RR

      2. Hallo Gunnar,

        substr() und andere ähnliche PHP-Funktionen arbeiten byteorientiert. Sie sind für UTF-8 nicht oder nur sehr bedingt geeignet.

        ?? Was wäre denn Bedingungen, unter denen sie geeignet wären?

        Wenn man sie dafür benutzt, wofür sie designed wurden: den byteorientierten Zugriff auf den Speicher.

        Da kann es kontraproduktiv sein, wenn man plötzlich nicht mehr weiß, wie viele Bytes jetzt betroffen sind. Da PHP keine eigentlichen Memory-Funktionen hat, nur so verschwurbelte Hilfsfunktionen (pack() + unpack()), sind die byteorientierten Stringfunktionen oft der einzige Weg, (fremde) Dateien mit festem Satzaufbau sauber zu lesen.

        LG RR on the Road again

        1. Wenn man sie dafür benutzt, wofür sie designed wurden: den byteorientierten Zugriff auf den Speicher.

          Da kann es kontraproduktiv sein, wenn man plötzlich nicht mehr weiß, wie viele Bytes jetzt betroffen sind. Da PHP keine eigentlichen Memory-Funktionen hat, nur so verschwurbelte Hilfsfunktionen (pack() + unpack()), sind die byteorientierten Stringfunktionen oft der einzige Weg, (fremde) Dateien mit festem Satzaufbau sauber zu lesen.

          Oder man operiert mit Codepoints:

          $c = new Codepoint();
          $name = 'Häßler';
          $cp_array = $c->codepoints($name);
          $subarray = array_slice($cp_array,0,2);
          echo $c->binary($subarray);
          

          Es gibt immer mehrere Wege. MfG

    2. Perfekt Danke!