Theo24: strlen bei Sonderzeichen - danach auf Index zugreifen

Guten Abend allerseits,

ich habe ein assoziatives Array mit Sonderzeichen (key), die beim SMS-Versand eine bestimmte Anzahl Zeichen einnehmen (value):

$chars = array("@"=>1,"$"=>1,"€"=>2);

Nun möchte ich in einem String jeden Buchstaben überprüfen, wieviele Zeichen er einnimmt. Das mache ich so:

$strl = strlen($text);  
for ($i = 0;$i < $strl; $i++){  
  $c = $text{$i};  
  if (isset($chars[$c]))						  
    $count += $chars[$c];  
}  

Das Problem: Einige Sonderzeichen bestehen "aus mehrereren Zeichen". So ist strlen("€") = 3. Das bedeutet das durchiterieren mit $text{$i} funktioniert nicht richtig, weil $text{$i} nur "ein Drittel" des Zeichens bekommt.
Mit mb_strlen($text,"UTF-8") bekomme ich immerhin die "richtige" Länge (also 1), aber das Euro-Zeichen bleibt trotzdem in 3 Teile unterteilt (0xe2, 0x82 und 0xac vgl. http://www.fileformat.info/info/unicode/char/20ac/index.htm).
Was kann ich tun, damit ich per Index auf das Eurozeichen im String $text zugreifen kann?
Herzlichen Dank

  1. Hi,

    Das Problem: Einige Sonderzeichen bestehen "aus mehrereren Zeichen".

    Nein, sie bestehen aus mehreren *Bytes*.
    Mach dir den Unterschied bitte klar - er ist extrem wichtig.

    Was kann ich tun, damit ich per Index auf das Eurozeichen im String $text zugreifen kann?

    Bspw. die mbstring-Funktionen, die du ja schon entdeckt hast, nutzen - mb_substr wäre eine Möglichkeit.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Oh Mann, mit mb_substr hatte ich es vorhin schon probiert - aber offenbar das encoding nicht gesetzt. Dann hat es natürlich nicht funktioniert.
      So geht es jetzt aber (vielen Dank Chris!)

      $text = "€";  
      $chars = array("@"=>1,"$"=>1,"€"=>2);  
      $count = 0;  
      $strl = mb_strlen($text,"UTF-8");  
      for ($i = 0;$i < $strl; $i++){  
        $c = mb_substr($text,$i,$i+1,"UTF-8");  
        if (isset($chars[$c]))  
          $count += $chars[$c];  
      }
      

      Hi,

      Das Problem: Einige Sonderzeichen bestehen "aus mehrereren Zeichen".

      Nein, sie bestehen aus mehreren *Bytes*.
      Mach dir den Unterschied bitte klar - er ist extrem wichtig.

      Was kann ich tun, damit ich per Index auf das Eurozeichen im String $text zugreifen kann?

      Bspw. die mbstring-Funktionen, die du ja schon entdeckt hast, nutzen - mb_substr wäre eine Möglichkeit.

      MfG ChrisB