Problem mit GD-Lib/imageTTFText

Nachdem ich nun 2 Tage beinahe erfolglos versuche mein Bildgenerierscript zum laufen zu bringen, dachte ich, ich schreib mal hier ins Forum.

So Geschichte ist folgende, zunächst lief meine komplette Page mit allen Scripten auf nem anderen Server eines Konkurenten. Alles hat reibungslos funktioniert. Bilder wurden ordnungsgemäß generiert.
Nachdem aber der Hoster derbe Probleme hatte, hab ich auf meinen bereits existierenden bplaced-Webspace gewechselt.
Nun das Problem, zwar werden mir Bilder generiert, aber es werden KEINE Umlaute dargestellt.
Jeder Umlaut, den ich verwende wird zu nem Plenk-Kästchen.

Ich hab hier jetzt einiger Umlautscripts über die Forensuche gefunden, sowie auch auf anderen Webseiten, aber nichts davon hat geklappt. Kodier ichs um, krieg ich statt ü (ASCII 252), ein A mit Tilde (188) und das Zeichen für 1/4 (195).

Schlussendlich fand ich bei den Bildeigenschaften heraus, dass er mir das Bild bzw. die Schrift drauf iwie in ISO-Latin kodiert, aber alles andere in UTF-8…

Hat jemand ne passende Lösung und/oder Lösungsvorschläge parat. Danke im Vorraus.

Link zur einer Bsp. Seite wäre: http://yurianu.bplaced.net/ado/tier.php?id=4

Du scheinst das Problem gelöst zu haben?
Mir wird auf dem Bild „Büll“ korrekt angezeigt.

Jein, das ganze funktioniert momentan nur für üs, weil ich dann jedes Zeichen extra behandeln müsste -> langes Script…
Nächstes Problem is dann, dass mein zentrierscript nicht mehr tut, weil ich ja aus einem zeichen (ü) iwie mehrere mach, zumindest wirds nicht mehr zentriert, sobald ein umlaut vorkommt…

Hi,

wie du das gelöst hast wäre interessant habe da auch schon lang ein Problem damit (umlaute)

lg flo

Generell scheinst du mit Umlauten, d.h. mit der Kodierung ein paar kleine Probleme zu haben.
Bei Kodierungen gibt es 4 Stellen, an denen man darauf achten muss, dass alles korrekt eingestellt ist.

[ol][li]Die Kodierungen der Datenbanken und Tabellen in MySQL.[/li]
[li]Die Verbindungskodierung, die man im PHP Script am besten nach dem Verbinden setzen sollte. MySQL konvertiert dann die Daten aus den Tabellen in die hier angegebene Kodierung automatisch.[/li]
[li]Die Dateikodierung, d.h. man sollte sichergehen, dass ALLE verwendeten PHP/HTML Dateien in der gewünschten Kodierung abgespeichert werden. Das stellt man in seinem Texteditor ein. Dies sollte die selbe Kodierung sein wie bei Punkt 2.[/li]
[li]Die Ausgabekodierung. In dem Fall meint man damit die Kodierung, die die letztendliche Seite hat. Dies gibt man mit der header() Funktion an. Hier sollte vielleicht noch erwähnt werden, dass die Funktion nichts an der Kodierung ändert, sondern dem Browser lediglich mitteilt welche Kodierung in Punkt 2 und 3 verwendet wurde damit dieser es korrekt darstellen kann.[/li][/ol]

Und als Tipp: verwende überall UTF-8

Dabei sollte dir klar sein, dass du eigentlich nie utf8_encode() oder utf8_decode() verwenden brauchst. Wenn du es tust, dann machst du ziemlich wahrscheinlich etwas falsch.

Imagettftext() akzeptiert, soweit ich weiß UTF-8.

mfg Balmung

Ich hab alles bis auf die Verlinkungscodierung, allerdings erkennt er die Funktion nicht…
mysql_set_charset bzw. mysqli_set_charset laufen beide nicht, selbst mit richtigen Parametern :wink:
(Tabellen, etc. alles UTF8)

Edit: Okay läuft doch, aber ändert absolut nichts :confused:

Da kommt es natürlich auch darauf an, welche MySQL Methoden du verwendest.
Ohne was konkretes zu sehen, wird es schwierig.

nutzt du mysql_connect()? mysqli_connect()? oder vllt eine der viele Klassen, die bereitgestellt werden?

mysqli … aber ich vermut kaum, dass es nur an den Funktionen von Mysql und mysqli liegt.
Hab grad nochmal meine DB durchgegangen und kontrolliert ob die Kollationen stimmen. ATM benutz ich utf8-general-ci.

[code]<?php
require(‘xxxxconfig.php’);

$id = $_GET[‘id’];
$connection = @mysqli_connect($HOST, $USER, $PW, $DB);
mysqli_set_charset($connection, ‘utf8’); // funktioniert zwar, liefert aber das gleiche ergebnis

mysqli_query($connection,‘set character set utf8;’);

$result = mysqli_query($connection, “SELECT * FROM tier WHERE t_id =”.$id);
while($row = mysqli_fetch_row($result)){
$str = $row[1];
$str2 = "Level: ".$row[2];

$image = @ImageCreateFromJPEG("$row[4]b.jpg");
if (!$image)
{$image = imageCreate(110,143);
$bg = imageColorAllocate($image,0,0,0);
}
$white = imageColorAllocate($image,255,255,255);
$black = imageColorAllocate($image,0,0,0);
$str_x = (int) (imagesx($image) - (imageFontWidth(1.5)*strLen($str))) /2;
$str_x2 = (int) (imagesx($image) - (imageFontWidth(2)*strLen($str2))) /2;//Mittig platziert
//imageString($image,2,$str_x,148,$str,$black);
imageTTFText($image,7,0,$str_x,158,$black,‘verdana.TTF’,$str);
imageString($image,2,$str_x2,163,$str2,$black);

header(‘Content-Type: image/jpeg’);
imageJPEG($image);
imageJPEG($image, “images/i$row[0].jpg”);

imageDestroy($image);
}//while
mysqli_close($connection);
?>[/code]

utf8-general-ci ist in ordnung und eigentlich auch „relativ“ unwichtig, da wegen der Verbindungskodierung sowieso alles in die richtige Kodierung konvertiert wird. Es ist aber durchaus sinnvoll in der Datenbank und in den Tabellen (jedes einzelne Feld überprüfen!) die selbe Kodierung zu nutzen wie überall sonst auch.

nun gut.
Wie wir hier sehen:
yurianu.bplaced.net/ado/tier.php?id=3
sehen wir, dass der Text „Schäferhund“, nicht utf-8 kodiert ist.
Wo immer der Text herkommt, irgendwo auf dem Weg zwischen seinem Ursprung und der Darstellung im Browser ist was schief gelaufen.

Dann solltest du auch mal überprüfen, ob der Text, den du im Bild angibst, wirklich UTF-8 kodiert ist. Mach Testausgaben etc. oder zeige uns relevanten Code.

de.php.net/manual/de/function.mb … coding.php

Die Zeile

brauchst du nicht. Das übernimmt mysqli_set_charset() für dich.

Das mit dem Schäferhund funktionier jetzt prima, danke, mysqli_set_charset() und es läuft, aber wieso das mit den bildern nich will… keine Ahnung

Edit: Hab ich entfernt, bleibt allerdings gleich ( wäre auch zu komisch gewesen xD)

Du hast da ne Mischung aus imagettftext() und imagestring().

Bei imageString() eher weniger problematisch, aber bei imagettftext() kannst du prinzipiell nicht die Breite des Strings ermitteln und somit auch nicht zuverlässig zentrieren.
Dass die Umlaute nicht korrekt dargestellt werden ist mir schleierhaft. So ein Kästchen taucht normal dann auf, wenn ein Zeichen in der verwendeten Schriftart nicht vorhanden ist, was bei Umlauten aber recht merkwürdig wäre.
Zumindest taucht pro Umlaut nur EIN Kästchen auf, d.h. der hat erkannt, dass es ein Multibytezeichen ist, und es nur nicht richtig dargestellt.

Das liegt daran, dass ich zunächst nur mit ImageString getestet hab, das ging dann nach dem Webspacewechsel nichtmehr… also mit dem Umlauten.
Siehe jetzt, habs grad wieder drin.
Ein Freund meinte dann, ich soll mal ne andere Font verwenden, aber wies mit der aussieht, weißt du ja mittlerweile

Du hast da wieder irgendwas zerschossen.
yurianu.bplaced.net/ado/tier.php

Sieht so aus als hättest du die mysql_set_charset in der tier.php vergessen oder so.
PS. wenn du die config Datei sowieso in jeder PHP Datei einbindest, kannst du das connect und set_charset doch auch da rein legen :slight_smile:

joa ich hab die utf8_encode funktionen raus gebaut und die mysqli_set_charset vergessen. Passiert beim vielen probieren schon mal ^^
Wenn ich jetzt z.B. die bilder.php?id=4 aufrufe und auf Eigenschaften gehe, steht bei der Kodierung immer noch ISO-8859-1, wahrscheinlich wird die Grafik irgendwie falsch erzeugt, aber ich kanns mir immer noch nicht erklären…

EDIT: Kann es eventuell sein, dass es an den JPEG Bildern liegt? Weil ich habs eben auf meinem anderen Webspace auch nochmal getestet, mit JPEG anstatt PNG…
Fazit PNG funktionieren iwie, aber JPEGs nich

Nein, daran wird es wahrscheinlich nicht liegen.

dann beschließ ich das Thema mal, ohne Lösung, scheinbar funktioniert es mit bplaced nich :/.
Hoffe es klappt mit meinem eigenen Webserver dann in 1-2 Monaten besser…, falls nicht xD, hört ihr von mir…
Auf jeden Fal klappts aufm anderen Space… (fehlerfrei) :confused: hm und falls wer doch den fehler entdeckt, so durch zufall, lässt es mich wissen via PM oder so

Nein, an bplaced liegt das definitiv nicht. Es ist wirklich essenziell, dass du überall das richtige Charset verwendest. Prüfe nochmals ob die Datenbanken, die Tabellen, die Datenbankverbindung das Skript und die Ausgabe (GD benötigt UTF-8) das gleiche Charset verwenden, oder ob nötige Umwandlungen erledigt werden.