ebody: Ungleiche Zeichenanzahl, obwohl String identisch ist

Hallo,

ich habe 2 identische Wörter die aus 2 verschiedenen Exceldateien stammen. Das Script liegt in einer Datei die UTF-8 ohne BOM kodiert ist. Wenn ich die beiden Wörter ausgeben lasse, werden für $strB 12 Zeichen angezeigt und für $strA 11, obwohl sie im Browser und auch im Quellcode identisch sind.

Das "Ö" verursacht den Unterschied, aber warum werden unterschiedlich viele Zeichen angezeigt?

$strA = "Ökologisch";
$strB = "Ökologisch";

$strA = mb_convert_encoding($strA, 'UTF-8');
$strB = mb_convert_encoding($strB, 'UTF-8');

var_dump($strA); // string(11) "Ökologisch" 
var_dump($strB); // string(12) "Ökologisch"
$strA = "Ö";
$strB = "Ö";

$strA = mb_convert_encoding($strA, 'UTF-8');
$strB = mb_convert_encoding($strB, 'UTF-8');

var_dump($strA); // string(2) "Ö" 
var_dump($strB); // string(3) "Ö"

Gruß ebody

akzeptierte Antworten

  1. Tach!

    Das "Ö" verursacht den Unterschied, aber warum werden unterschiedlich viele Zeichen angezeigt?

    Da musst du mal den Hex-Code analysieren. bin2hex() oder einfacher mit urlencode().

    dedlfix.

    1. Der Code zeigt einen Unterschied:

      $strA = "Ö";
      $strB = "Ö";
      
      echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
      echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
      

      Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?

      Gruß ebody

      1. @@ebody

        Der Code zeigt einen Unterschied:

        $strA = "Ö";
        $strB = "Ö";
        
        echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
        echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
        

        Und der Artikel Normalisierung in HTML und CSS sagt dir, was es damit auf sich hat.

        Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?

        Erster Suchtreffer: The Normalizer class

        LLAP 🖖

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

        Der Code zeigt einen Unterschied:

        $strA = "Ö";
        $strB = "Ö";
        
        echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
        echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
        

        Also ein Ö und ein O mit extra Pünktchen: ̈◌

        Wie kann ich jetzt weiter vorgehen, damit die Strings wirklich identisch sind?

        Die Verwendung von Apple-Produkten untersagen. Oder eine UTF-8-Normalisierung vornehmen. Wie oder ob letzteres in PHP geht, weiß ich aber nicht.

        dedlfix.

        1. Vielen Dank euch beiden, dass war sehr hilfreich! Folgendes Script habe ich verwendet und es gibt beide "Ö" identisch aus.

          $strA = "Ö";
          $strB = "Ö";
          
          var_dump($strA); // string(2) "Ö"
          var_dump($strB); // string(3) "Ö"
          
          echo "<p>A: ".bin2hex($strA)."</p>"; // A: c396
          echo "<p>B: ".bin2hex($strB)."</p>"; // B: 4fcc88
          
          // String normalisieren
          $strA = normalizer_normalize( $strA, Normalizer::FORM_C );
          $strB = normalizer_normalize( $strB, Normalizer::FORM_C );
          
          var_dump($strA); // string(2) "Ö"
          var_dump($strB); // string(2) "Ö"
          

          Zuvor musste ich in der php.ini noch extension=php_intl.dll auskommentieren.

          Gruß ebody

          1. Hello,

            danke für die ausführliche Rückmeldung.

            Wäre es nicht zweckmäßiger, tatsächlich eine Instanz der Klasse zu erzeugen, wenn man sie öfter hintereinander benutzt? So wie ich das jetzt sehe, hast Du die Methode doch z. Zt. statisch aufgerufen, oder?

            Zuvor musste ich in der php.ini noch extension=php_intl.dll auskommentieren.

            Du meintest sicherlich "die Auskommentierung entfernen"?

            Liebe Grüße
            Tom S.

            --
            Die Krawatte ist das Kopftuch des Westens
            1. Hallo Tom,

              ja genau, ich meinte eigentlich, dass ich das Zeichen ";" zum auskommentieren entfernt habe.

              Gruß ebody

      3. @@ebody

        Der Code zeigt einen Unterschied:

        Und dann gibt’s da noch Fonts, die auch einen Unterschied zeigen.

        Kunst kommt von können, Ku¨nste eher nicht. ;-)

        LLAP 🖖

        --
        “When UX doesn’t consider all users, shouldn’t it be known as ‘Some User Experience’ or... SUX? #a11y” —Billy Gregory
        1. Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.

          Danke!

          1. @@pl

            Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.

            Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.

            LLAP 🖖

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

              Jetzt ist mir endlich klar, warum es in einer Buchstabensuppe keine Umlaute gibt.

              Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.

              Stimmt doch gar nicht.

              Nur weil es nicht alle kyrillischen Zeichen gibt, sind das nicht "keine".

              A B C E H K M O P T X sind üblicherweise dabei.

              ;-)

              cu,
              Andreas a/k/a MudGuard

              1. @@MudGuard

                Was mir immer noch nicht klar ist: warum es in Russisch Brot keine kyrillischen, sondern lateinische Buchstaben gibt.

                Stimmt doch gar nicht.

                Nur weil es nicht alle kyrillischen Zeichen gibt, sind das nicht "keine".

                A B C E H K M O P T X sind üblicherweise dabei.

                Ha, Г und И und Я ja auch. Nur die Glasur ist auf der falschen Seite.

                LLAP 🖖

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

                  siehe auch Artikel

                  Liebe Grüße
                  Tom S.

                  --
                  Die Krawatte ist das Kopftuch des Westens
  2. Die Bytesequenzen sind nicht identisch:

    LATIN CAPITAL LETTER O WITH DIAERESIS 
    C3 96
    Ö
    
    vs.
    
    LATIN CAPITAL LETTER O 
    COMBINING DIAERESIS 
    4F CC 88
    Ö
    

    MfG

    1. @@pl

      Die Bytesequenzen sind nicht identisch:

      Das hatten wir gestern schon geklärt. Und was gibt’s neues?

      LLAP 🖖

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