[TYPO3-german] Probleme mit Umlauten im GMENU seit einem Umzug auf eienn neuen Server

Sven Grützmann sven.gruetzmann at gmx.net
Sun Feb 4 14:19:30 CET 2007


Hallo Christian,


> Seit einem Umzug auf einen neuen Server, werden die Umlaute in GMENUs in 
> keiner Typo3 Installation mehr richtig gerendert.

Ich habe ein ähnliches Problem. Das Problem tritt nur auf, wenn ich Suse 
Linux ab Version 10.1 mit PHP5 und gebundelter gdlib nutze. Teste mal 
folgendes Skript:

<?php
header("Content-type: image/png");

$im = imagecreatetruecolor(400, 30);

$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

imagefilledrectangle($im, 0, 0, 399, 29, $white);

$text = 'Umlaute: äöü...';
$font = 'arial.ttf';
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);

imagepng($im);
imagedestroy($im);
?>

Wenn die Umlaute in dem Teststring nicht richtig dargestellt werden, 
liegt es an der gdlib. Schickst du den Teststring durch die Funktion 
"foxy_utf8_to_nce" (-> http://de.php.net/imagettftext#57416 ) sollte 
wieder alles in Ordnung sein. Diese Funktion konvertiert utf8-Zeichen 
als numerische Entities.

--------------------------------------------
define('EMPTY_STRING', '');

function foxy_utf8_to_nce(
   $utf = EMPTY_STRING
) {
   if($utf == EMPTY_STRING) 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 = EMPTY_STRING;
   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);
}
--------------------------------------------

Grüße, Sven


More information about the TYPO3-german mailing list