Zum Inhalt springen

GraphicsMagick und Umlaute

Erstellt am 30. Januar 2007 · 2 Antworten · letzte Antwort am 20. August 2008

Tags: Frage

Bluto ·

Hallo,

folgendes Problem: Ich generiere grafische Überschriften. Funktioniert auch, nur... werden leider die Punkte/Striche der Umlaute neben und nicht über dem Buchstaben angezeigt ungef"ahr so.

System:
GraphicsMagick 1.1.6
GD_Lib 2.0 or higher
Freetype 2.2.1
PHP 5.1.6

Hat jemand das gleiche Problem mal gehabt und gelöst oder weiß sonstwie Rat?

Vielen Dank und schöne Grüße,
Jan

gruetze ·

Hallo Jan,

das Problem liegt eventuell an der verwendeten gdlib. Also entweder php neukompilieren oder das Problem mit einer userFunction lösen:

Datei user_convchar.php:

<?php
class user_convchar {
    function encode($content,$conf) {
          $convmap = array(0x80, 0xff, 0, 0xff);
          return mb_encode_numericentity($content,$convmap, "iso-8859-1");
    }
}
?>

...und dann per Typoscript einbinden:

includeLibs.convchar_script = fileadmin/libs/user_convchar.php
...
10.text.postUserFunc = user_convchar->encode

wenn Du als Zeichensatz "utf-8" verwendest musst Du "iso-8859-1" entsprechend in der PHP-Datei ändern. Um die PHP-Funktion "mb_encode_numericentity()" nutzen zu können muss das PHP-Modul mbstring installiert sein.
alternativ kannst du diese PHP-Funktion verwenden:

function foxy_utf8_to_nce(
  $content
) {

  $utf = $content;
  $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);
}

UDPATE:
ich habe gerade diesen Thread entdeckt:
http://typo3forum.de/forum/list/list_post//56087/
...dort wird das Problem auch behandelt. Ich habe mich bei meinem Posting auch auf den Thread in der Mailingliste bezogen.

Bluto ·

Und anderthalb Jahre später arbeite ich wieder an dem Server und habe das gleiche Problem. Da merke ich, dass ich
a) das gleiche Problem schon mal hatte und
b) das ich mich nie bei gruetze bedankt habe.

Also

Danke gruetze,

Jan