Problem mit UTF-8

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit UTF-8

    Hallo,

    ich soll eine Seite in Tschechisch machen. Auf dieser Seite gibt es ein Formular mit einem Eingabefeld, wo man dann auch tschechische Sonderhzeichen eingeben kann.

    Ich möchte z.B. die Eingabe von "ž" in dieses Format bringen: & #382; (das wäre der UTF-8 HTML Entity Code von diesem Zeichen - in dez.)

    Wie schaffe ich es, dasss mein PHP Script dies automatisch so umwandelt?

    Danke!

    lg, Dan

  • #2
    Das wäre eine "numeric(al) character reference" und hätte mit UTF-8 nichts zu tun. In PHP6 gäbe es für die Umwandlung von UTF-8 nach NCR die Function unicode_encode(). Die Benutzerkommentare sind vielleicht hilfreich beim Selberbasteln einer vergleichbaren Funktion.

    Je nach vorhandenen Extensions könntest du auf mb_encode_numericentity() oder (eventuell) iconv() zurückgreifen. Notfalls baust du dir die Konvertierungsfunktion selber -- wie in diesem Beispiel:

    Code:
    function foxy_utf8_to_nce( 
      $utf = EMPTY_STRING 
    ) { 
      if ('' === $utf) return($utf); 
    
      $max_count = 5; // flag-bits in $max_mark ( 1111 1000 == 5 times 1) 
      $max_mark = 248; // marker for a (theoretical ;-)) 5-byte-char and mask for a 4-byte-char; 
    
      $html = ''; 
      for($str_pos = 0; $str_pos < strlen($utf); $str_pos++) { 
        $old_chr = $utf{$str_pos}; 
        $old_val = ord( $utf{$str_pos} ); 
        $new_val = 0; 
    
        $utf8_marker = 0; 
    
        // skip non-utf-8-chars 
        if( $old_val > 127 ) { 
          $mark = $max_mark; 
          for($byte_ctr = $max_count; $byte_ctr > 2; $byte_ctr--) { 
            // actual byte is utf-8-marker? 
            if( ( $old_val & $mark  ) == ( ($mark << 1) & 255 ) ) { 
              $utf8_marker = $byte_ctr - 1; 
              break; 
            } 
            $mark = ($mark << 1) & 255; 
          } 
        } 
    
        // marker found: collect following bytes 
        if($utf8_marker > 1 and isset( $utf{$str_pos + 1} ) ) { 
          $str_off = 0; 
          $new_val = $old_val & (127 >> $utf8_marker); 
          for($byte_ctr = $utf8_marker; $byte_ctr > 1; $byte_ctr--) { 
    
            // check if following chars are UTF8 additional data blocks 
            // UTF8 and ord() > 127 
            if( (ord($utf{$str_pos + 1}) & 192) == 128 ) { 
              $new_val = $new_val << 6; 
              $str_off++; 
              // no need for Addition, bitwise OR is sufficient 
              // 63: more UTF8-bytes; 0011 1111 
              $new_val = $new_val | ( ord( $utf{$str_pos + $str_off} ) & 63 ); 
            } 
            // no UTF8, but ord() > 127 
            // nevertheless convert first char to NCE 
            else { 
              $new_val = $old_val; 
            } 
          } 
          // build NCE-Code 
          $html .= "&#$new_val;"; 
          // Skip additional UTF-8-Bytes 
          $str_pos = $str_pos + $str_off; 
        } 
        else { 
          $html .= chr($old_val); 
          $new_val = $old_val; 
        } 
      } 
      return($html); 
    }
    Diese Funktion ist wirklich nur als Beispiel zu sehen, sie war ursprünglich (Oktober 2005) als Übung gedacht, um UTF-8 besser zu verstehen, kam dann aber als Workaround für ein Problem mit imageTTFText() zum Einsatz. Möglicherweise hab ich damals ein paar Ungereimtheiten eingebaut, die ich heute vermeiden würde. Funktioniert hats aber. ;-)

    ... und langsamer als eine eingebaute Funktion ist die reine PHP-Lösung natürlich auch.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Alternativ kann man natürlich auch einfach den richtigen Zeichensatz einstellen, unter dem die Website läuft, und alles an Arbeit dem Browser überlassen.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar

      Lädt...
      X