Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wyświetlanie Czcionek Utf8 W Obrazku
Forum PHP.pl > Forum > PHP
piernik
Tworzę dynamicznie obrazek - wykres. Legenda będzie w wielu językach - równiez w chińskim dlatego użyłem kodowania utf8.

Przy wyświetlaniu tekstu na obrazku pokazują mi się krzaczki zamiast np. polskich liter. Mozna jakoś przekonwertować te znaki by php wyświetlał je w utf8??
carramba
w gd2 zeby wyswietlic znaczki trzeba przekonwertowac utf-8 na unicode
za pomca funkcj :

  1. <?php
  2.  
  3.  
  4. /*===============================================================================
  5. /* utf8ToUnicode = zamienia znaki utf8 na unicode
  6. /*===============================================================================
  7. /
  8. function utf8ToUnicodeEntities ($source) {
  9.    // array used to figure what number to decrement from character order value 
  10.    // according to number of characters used to map unicode to ascii by utf-8
  11.    $decrement[4] = 240;
  12.    $decrement[3] = 224;
  13.    $decrement[2] = 192;
  14.    $decrement[1] = 0;
  15.    
  16.    // the number of bits to shift each charNum by
  17.    $shift[1][0] = 0;
  18.    $shift[2][0] = 6;
  19.    $shift[2][1] = 0;
  20.    $shift[3][0] = 12;
  21.    $shift[3][1] = 6;
  22.    $shift[3][2] = 0;
  23.    $shift[4][0] = 18;
  24.    $shift[4][1] = 12;
  25.    $shift[4][2] = 6;
  26.    $shift[4][3] = 0;
  27.    
  28.    $pos = 0;
  29.    $len = strlen ($source);
  30.    $encodedString = '';
  31.    while ($pos < $len) {
  32.  $asciiPos = ord (substr ($source, $pos, 1));
  33.  if (($asciiPos >= 240) && ($asciiPos <= 255)) {
  34.  // 4 chars representing one unicode character
  35.  $thisLetter = substr ($source, $pos, 4);
  36.  $pos += 4;
  37.  }
  38.  else if (($asciiPos >= 224) && ($asciiPos <= 239)) {
  39.  // 3 chars representing one unicode character
  40.  $thisLetter = substr ($source, $pos, 3);
  41.  $pos += 3;
  42.  }
  43.  else if (($asciiPos >= 192) && ($asciiPos <= 223)) {
  44.  // 2 chars representing one unicode character
  45.  $thisLetter = substr ($source, $pos, 2);
  46.  $pos += 2;
  47.  }
  48.  else {
  49.  // 1 char (lower ascii)
  50.  $thisLetter = substr ($source, $pos, 1);
  51.  $pos += 1;
  52.  }
  53.  
  54.  // process the string representing the letter to a unicode entity
  55.  $thisLen = strlen ($thisLetter);
  56.  $thisPos = 0;
  57.  $decimalCode = 0;
  58.  while ($thisPos < $thisLen) {
  59.  $thisCharOrd = ord (substr ($thisLetter, $thisPos, 1));
  60.  if ($thisPos == 0) {
  61.  $charNum = intval ($thisCharOrd - $decrement[$thisLen]);
  62.  $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
  63.  }
  64.  else {
  65.  $charNum = intval ($thisCharOrd - 128);
  66.  $decimalCode += ($charNum << $shift[$thisLen][$thisPos]);
  67.  }
  68.  
  69.  $thisPos++;
  70.  }
  71.  
  72.  if ($thisLen == 1)
  73.  $encodedLetter = \"&#\". str_pad($decimalCode, 3, \"0\", STR_PAD_LEFT) . ';';
  74.  else
  75.  $encodedLetter = \"&#\". str_pad($decimalCode, 5, \"0\", STR_PAD_LEFT) . ';';
  76.  
  77.  $encodedString .= $encodedLetter;
  78.    }
  79.  
  80.    return $encodedString;
  81. }
  82. ?>
piernik
Dzięki - wypróbuję, ale czy zadziała to nawet dla czcionek po chińsku??

Mam równiez inny problem pewno w przeglądarce wyglądałoby to ok, ale tak się nie dzieje na obrazie wygenerowanym przez php. Mam mianowicie kody znaków a nie same kody (np. Od itd.)
carramba
unicode wyswietli ci nawet tajwanski pod warunkiem ze czcionka za pomoca ktorej generujesz obrazek bedzie zawierala tajwanskie znaki. nie bardzo rozumiem twoje drugie pytanie
piernik
No tak - nie zobaczyłem jak wygląda mój post - kody zostały zamienione na znaki - tak jak to jest w HTMLu, ale w obrazku jest inaczej...
Oto on:



Jak widzisz kody nie zostały zmienione na litery... Wiesz jak to poprawić?
carramba
a mozesz mi wyslac na meila albo wkleic tutaj kod funkcji generujacej ?
przedwczoraj generowalem obrazki do jakiejs strony i unicode zalatwial
sprawe i apropo uzywasz gd czy gd2 ? generowany jest jpg czy png ?

ja takie cos zrobilem w ten sposob :

  1. <?php
  2.  
  3. $rysunek = ImageCreateFromPng('jakisobrazek.png');
  4.  
  5. $bialy = ImageColorAllocate($rysunek, 225, 255, 255);
  6. $string = iso88592toUtf8urls_decode($string);
  7. $font = '/sciezka/verdana.ttf';
  8.  
  9. ImageTTFText ($rysunek, 12, 0, 10, 10, $bialy, $font, $string);
  10. ?>


//powiadom przegl&plusmn;dark&ecirc; o zmiarze przes&sup3;ania rysunku
header("Content-type: image/png");
//prze&para;lij rysunek do przegl&plusmn;darki...
ImagePng($rysunek);
//zwolnij zasoby przydzielone do rysunku
ImageDestroy($rysunek);[/php]
piernik
Używam gd2, generuję png a jeżeli chodzi o kod to trudno będzie go przesłać bo korzystam z systemu PhpAdsNew, który generuje mi ten wykres. System ten jest dość duży i zapewne nie będzie chodził bez instalacji...

Patrzałem na twój kod i jedyna różnica jest taka że ja korzystam z funkcji imagestring(), która generuje napis. Funkcja ta nie potrzebuje plików czcionek bo korzysta z systemowych serwera. Czy to może być powodem nie zmieniania tych znaków??
carramba
tak to moze byc powodem, sproboj przez TTF, powinno pomoc.
piernik
Dzięki za pomoc...
Zrobiłem to jednak na ttf'ie - załadowałem plik arilauni, który ma 23 MB:) Wszystkie znaki utfa:) Ale na szczęście działa - jeszcze raz dzięki za pomoc...
carramba
no problemo. apropo masz moze zestaw arial,arialb,ariali,arialbi ze znakami ISO-8859-2 ? potrzebuje czegos takiego do generowania PDF.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.