Pater: Zeichenkodierung

Einen schoenen sonnigen Nachmittag,

ich dachte immer, dass mich das Kaempfen mit den Zeichensaetzen nie betreffen wird, aber jetzt ist es doch geschehen...

Ich habe eine Textdatei die (ganz sicher) in UTF-8 kodiert ist. In meiner php-Datei ist per header() und charset auch UTF-8 festgelegt. Trotzdem wird bei echo mb_internal_encoding(); ein "ISO-8859-1" ausgegeben. Aber egal, dass wird per mb_internal_encoding("UTF-8"); behoben.

In der Datei sind Keywoerter, aus denen eine Navigation aufgebaut werden soll. Diese Navigation besteht aus einem Array aus den ersten Buchstaben jedes Keywords, welches per array_unique gereinigt wird.
Beispiel:
Ameise, Apfel, Baum, Krankenhaus.

Navigation:
A B K

Das Problem ist, dass die Keywords auch mit Umlauten beginnen. Eigentlich duerfte das wegen der UTF-8 Kodierung kein Problem sein.

for($j=0;$j<count($keywords)+1;$j++){  
          $bla[$j]=substr(strtoupper(trim($keywords[$j])),0,1);  
                    }  
$bla=array_unique($bla);

var_dump zeigt, dass es eigentlich richtig ist, trotzdem krieg ich diese Fragezeichen innerhalb einer Raute an der Stelle, wo eigentlich Umlaute sein sollten.
Wenn ich jetzt substr durch mb_substr($keywords[$j],0,1,'UTF-8') ersetze, bekomme ich andere merkwuerdige Zeichen.

Ich hoffe, dass mir jemand das Thema Zeichenkodierung wenigstens ein bisschen naeherbringen kann.

Gruss,
 der Pater

  1. Hi,

    Das Problem ist, dass die Keywords auch mit Umlauten beginnen. Eigentlich duerfte das wegen der UTF-8 Kodierung kein Problem sein.

    Es wird zum Problem, wenn du nicht berücksichtigst, dass UTF-8 Zeichen ggf. in mehreren Bytes kodiert, und dass die normalen Stringfunktionen von PHP damit nicht korrekt umgehen.

    for($j=0;$j<count($keywords)+1;$j++){

    $bla[$j]=substr(strtoupper(trim($keywords[$j])),0,1);

      
    Du schneidest hier ein einzelnes Byte aus einem String aus, obwohl du eigentlich ein Zeichen ausschneiden willst.  
      
    Nutze die mbstring-Funktionen.  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Hallo

      Nutze die mbstring-Funktionen.

      auch hier mein Hinweis, Postings genau lesen ;)
      Habe mb_substr benutzt, Umlaute sind trotzdem nicht dargestellt

      mfg Pater

      1. Hello,

        Nutze die mbstring-Funktionen.
        auch hier mein Hinweis, Postings genau lesen ;)

        Nur hier _mein_ Hinweis.

        Immer relevante Codeteile senden und nicht nur unzureichende Ausschnitte.

        Vermutlich müsstest Du auch mb_strtoupper() benutzen, aber den Teil des Codes zeigst Du ja gar nicht erst.

        http://de3.php.net/manual/en/function.mb-strtoupper.php

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Hi,

          Nur hier _mein_ Hinweis.

          Immer relevante Codeteile senden und nicht nur unzureichende Ausschnitte.

          Vermutlich müsstest Du auch mb_strtoupper() benutzen, aber den Teil des Codes zeigst Du ja gar nicht erst.

          http://de3.php.net/manual/en/function.mb-strtoupper.php

          da war ich wohl zu voreilig mit dem Verurteilen ;) Ich hab doch den Codeteil mit strtoupper() gezeigt?
          Aber Vielen Dank, es funktioniert jetzt wunderbar, ich haette vllt das Manual zuerst noch sorgfaeltiger konsultieren sollen.

          ein gluecklicher Pater

  2. Hello Peter,

    In der Datei sind Keywoerter, aus denen eine Navigation aufgebaut werden soll. Diese Navigation besteht aus einem Array aus den ersten Buchstaben jedes Keywords, welches per array_unique gereinigt wird.

    Beispiel:
    Ameise, Apfel, Baum, Krankenhaus.

    Navigation:
    A B K

    Das Problem ist, dass die Keywords auch mit Umlauten beginnen. Eigentlich duerfte das wegen der UTF-8 Kodierung kein Problem sein.

    [code lang=php]for($j=0;$j<count($keywords)+1;$j++){
              $bla[$j]=substr(strtoupper(trim($keywords[$j])),0,1);

    Und was für eine Funktion benutzt Du da gerade für den Teiltext?
    Ist die auch bestimmt aus der Gruppe der multibytefähigen Funktionen?

    N E I N  ;-P

    siehe mb_substr()
    http://de3.php.net/manual/en/function.mb-substr.php

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Und was für eine Funktion benutzt Du da gerade für den Teiltext?
      Ist die auch bestimmt aus der Gruppe der multibytefähigen Funktionen?

      N E I N  ;-P

      siehe mb_substr()
      http://de3.php.net/manual/en/function.mb-substr.php

      Ich verweise mal ganz dreist auf meinen Post, der offenbar nicht ganz zu Ende gelesen wurde.
      Ich habe testweise auch mb_substr eingesetzt, das gleiche Ergebnis, die Umlaute werden nicht korrekt angezeigt.

      Pater, nicht Peter ;)

  3. @@Pater:

    nuqneH

    ich dachte immer, dass mich das Kaempfen mit den Zeichensaetzen nie betreffen wird, aber jetzt ist es doch geschehen...

    Stimmt. Dein Zeichensatz scheint kein 'ä' zu enthalten.

    Ich habe eine Textdatei die (ganz sicher) in UTF-8 kodiert ist.

    Richtig, UTF-8 ist eine Zeichen_codierung_, kein Zeichen_satz_. Es ist essentiell, beides zu unterscheiden.

    Ich hoffe, dass mir jemand das Thema Zeichenkodierung wenigstens ein bisschen naeherbringen kann.

    Zeichencodierung für Anfänger
    Zeichencodierungen: grundlegende Konzepte
    Umgang mit Zeichencodierungen in HTML und CSS

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)