[Tutorial]Kleine Dynamische Foren Signatur - Random-Text

sixpack hat hier seine Version der dynamischen Forensignatur gepostet - Und um eine Alternative zu seinem Script anzubieten, die nicht OS, Browser und IP ausspuckt, sondern zufällig lustige Sätze (siehe meine Sig) habe ich mir gedacht, dass ich meinen Code (den ich teilweise von sixpack geklaut habe) hier mal offenlege und erläutere… :ps:

Zuerst brauchen wir ein Hintergrundbild. Meines habe ich in Anlehnung an das bplaced-Forum gestaltet und bgrnd.png genannt. es funktionieren auch andere Grafiktypen - PNG liefert aber imho ein schöneres Ergebnis als bspw. GIFs oder JPGs.

Dann müssen wir noch die Schriftart hochladen, in der der Text später angezeigt werden soll. Ich habe hier bspw. die jedem Windoof-Anwender bekannte arial.ttf genommen.

Wenden wir uns nun dem eigentlichen Script zu.

[code]<?php

$text_zufall[1]=‚Mein Spruch‘;
$text_zufall[2]=‚Mein anderer Spruch‘;
$text_zufall[3]=‚Und noch ein anderer Spruch‘;
$zufall_key = rand(1,3);

header(„Content-type: image/png“);
$img = imagecreatefrompng(„bgrnd.png“);
$bblue = imagecolorallocate($img,11,95,180);
imagettftext($img, 12, 0, 4, 15, $bblue, „arial.ttf“,"$text_zufall[$zufall_key]");
imagepng($img);

?>[/code]

$text_zufall[#]=‚Text‘; erlaubt uns die Texte zu erstellen. Für jeden Text müssen wir dazu einfach eine neue Zeile hinzufügen und die Zahl in eckigen Klammern pro Zeile um 1 erhöhen.

$zufall_key = rand(#,#); ist unser Zufallsgenerator. der Zufallsgenerator schmeißt jetzt eine Zahl aus, die zwischen den 2 Werten in den Klammern liegt. Idealerweise sollte man hier die kleinste Zahl (1 für Spruch1) sowie die größte Zahl (hier 3 für Spruch 3) nehmen, ansonsten klappt es nicht richtig.

header(„Content-type: image/png“); erläutert, dass es sich um eine Grafik handeln soll.

$img = imagecreatefrompng(„meinegrafik.png“); gibt das Bild an, aus dem später unser Spruch-Rotator gebaut werden soll.

$bblue = imagecolorallocate($img,11,95,180); ist eine Variable, die unsere Textfarbe bestimmt. Ich habe hier das bekannte b-blau verwendet, es funktioniert aber natürlich mit jeder anderen Farbe auch.

imagettftext($img, 12, 0, 4, 15, $bblue, „arial.ttf“,"$text_zufall[$zufall_key]"); führt schließlich alles zusammen. $img ruft unser Hintergrundbild auf, die 12 ist unser Schriftgrad, die 0 steht für die Drehung in Grad gegen den Uhrzeigersinn - o steht also für „keine Drehung“. Die Werte dannach geben die Position an, an die der Text gesetzt werden soll (X=4, Y=15) Einfach ein wenig rumprobieren, bis der Text schön sitzt. Anschließend rufen wir die Variable $bblue auf, damit der Text schön bunt wird, und schließlich holen wir uns den Zufallstext aus der zuvor erstellten Liste.

imagepng($img); erzeugt schließlich aus dem ganzen Kram ein Bild im PNG-Format.


Die Zufalls-Texte sollten natürlich nicht zu lang sein, sonst werden sie am Rande des Hintergrundbildes abgeschnitten.

In den Texten sind auch Umlaute und Zeichen möglich, die jedoch „dezimal“ vorliegen müssen. die wichtigesten Zeichen habe ich hier aufgelistet. Ausführlicher gibt es die Liste hier.
Ä Ä
Ö Ö
Ü Ü
ä ä
ö ö
ü ü
ß ß
Herz :heart:

Im Script sollte also ein „Gutän Morgän“ so aussehen: Gutän Morgän


Fragen, Probleme, Ideen, Kritik und Heiratsanträge bitte hier im Thread :smiley:

Kerbi, willst du mich heiraten? :ps:

:ps:

cool wäre es wenn man sätze in ne txt schreiben könnte und dein script das ganze mit fopen ausließt :slight_smile:

$text_zufall = file("zufallstexte.txt");
$zufall_key = rand(0, count($text_zufall)-1);

Das ist auch 'ne Möglichkeit. balmung hat ja hier schon die Lösung dazu gepostet - ich wollte meine Signatur ja auch eigentlich nicht veröffentlichen, hatte aber heute morgen Langeweile :ps:

Die Codes für ä, ö, ü usw. sehen nach HTML-Entities aus. Funktioniert auch jeder andere Entitie? und würde auch ä funktionieren?

Bei meinen Tests hier auf bplaced haben ä und Co nicht funktioniert, sondern eben nur die o.g.

Ich nehme an imagettftext() erwartet utf-8 kodierten Text. Jedenfalls ist es bei mir der Fall und es klappt mit utf-8 wunderbar.
Mit numerischen HTML Entities sollte es sogar mit Japanischen Zeichen klappen, solange die verwendete Schriftart Japanische Zeichen beinhaltet (in meiner Signatur müsste man es gelegentlich sehen können).

mfg Balmung

Stimmt :smiley: Hätte ich php.net mal vorher studiert :ps:

ok, die decimal codes lassen sich baer ja mit einem kleinen php script rauskriegen:

<html>
<head>
<title>Entitie Generator</title>
</head>
<body>
<h2>Entitie Generator</h2>
<?php

if(!isset($_POST['gesendet'])){
echo "<form action=\"entitieGenerator.php\" method=\"post\">\n";
echo "Zeichen, das verschl&uuml;sselt werden soll: <input type=\"text\" name=\"char\" />\n";
echo "<br />\n<input type=\"submit\" name=\"gesendet\" />\n</form>";
}
else{
echo "<strong>Code:</strong><br />\n";
echo htmlspecialchars("&#" . ord($_POST['char']) . ";") . "\n";
echo "<br /><br /><a href=\"entitieGenerator.php\">neuer Code</a>";
}
?>
</body>
</html>

<!-- (C) Copyright 2008 jw-lighting //-->

hier zu sehen: Enitie Generator

[i]@jw-lighting Das gilt aber nur für alle NORMALEN 1-byte Zeichen (iso-8859-1). Wenns in den komplexeren höheren Bereich des Unicode Zeichensatzes geht, in dem ein Zeichen aus mehreren Byte besteht (ord() akzeptiert nur 1 Byte), dann ist es schon eine ganz andere Sache, herauszufinden welche Unicode Nummern dahinter stecken. Nicht unmöglich, aber unsinnig wenn PHP utf-8 direkt akzeptiert.[/i]

mit utf8_encode() sollte man einen (iso-8859-1 kodierten) Text in utf-8 kodieren können.
Wenn man nicht weiß ob der text utf-8 kodiert ist oder nicht, könnte man sich htmlentities() zunutze machen, um das heraus zu finden. Ist zwar nicht die schönste Lösung, aber sollte ihren Zweck erfüllen:

function is_utf8($str)
{
	$res = @htmlentities($str, null, 'UTF-8');
	if($res === false)
		return false;
	return true;
}

//Anwendung
if(!is_utf8($text))
	$text = utf8_encode($text);

mfg Balmung

[size=90]Edit: wenn jemand eine PHP-funktion kennt, die bereits diese “is-utf8” Funktion übernimmt, wäre es sehr lieb, wenn mir das jemand mitteilen würde. Bisher habe ich nichts dergleichen gefunden.[/size]

Mensch Mensch jetzt lag der Thread fast ein Jahr vergraben und nun wollt Ihr es aber Wissen. :slight_smile:
Freut mich dennoch das Ihr da nun so richtig gas gebt :wink:

Ich habs übrigens auch mit nem array gelöst …

Nun die Zufallsprüche habe ich auch schon länger mit drin…

Aber es ist wieder eine neue Version in Planung, die sollte in den nächsten 2-3 Wochen hoffentlich Fertig sein, sofern ich Zeit finde :smiley:

Mal sehen wann es soweit ist.

Gruß Six

Hier auf bplaced hat es mit utf-8 aus irgendwelchen Gründen nicht so funktioniert wie geplant.
Ich editiere den Fehler später mal hier rein (bin gerade nicht zuhause), es gab jedenfalls ein Problem mit meinen Japanischen Zeichen… Wenn es keine Japanische Zeichen enthält, kam der Fehler nicht.
Deshalb hab ich eine kleine Funktion geschrieben, welche utf-8 kodierten Text in numerische htmlentities umwandelt.
Die Funktion geht davon aus, dass der Text 100% utf-8 ist, also sollte ihr vorher dafür sorgen, dass dieser es auch ist.

[code]<?php

function utf8entities($str)
{

$pow6  = bcpow('2', '6');
$pow12 = bcpow('2', '12');
$pow24 = bcpow('2', '24');
$ostr = "";

for($n=0; $n<=strlen($str); $n++)
{
	$l = $str{$n};
	$o = ord($l);
	if($o <= 127)
	{
		$ostr .= $l;
		
	}
	elseif($o >= 192 && $o <= 223) //1 Folgebyte
	{
		//110xxxxx 10xxxxxx
		$a = ord($str[$n]);
		$b = ord($str[$n+1]);
		$uni = (($a & 31) * $pow6) + ($b & 63);
		$ostr .= '&#'.$uni.';';
		$n=$n+1;
	}
	elseif($o >= 224 && $o <= 239) //2 Folgebyte
	{
		//1110xxxx 10xxxxxx 10xxxxxx
		$a = ord($str[$n]);
		$b = ord($str[$n+1]);
		$c = ord($str[$n+2]);
		$uni = (($a & 15) * $pow12) + (($b & 63) * $pow6) + ($c & 63);
		$ostr .= '&#'.$uni.';';
		$n=$n+2;
	}
	elseif($o >= 240 && $o <= 247) //3 Folgebyte
	{
		//11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
		$a = ord($str[$n]);
		$b = ord($str[$n+1]);
		$c = ord($str[$n+2]);
		$d = ord($str[$n+3]);
		$uni = (($a & 7) * $pow24) + (($b & 63) * $pow12) + (($c & 63) * $pow6) + ($d & 63);
		$ostr .= '&#'.$uni.';';
		$n=$n+3;
	}
}
return $ostr;

}

$text = ‘梶浦由記 – morning moon ä ö ü’;
echo utf8entities($text);
[/code]

Stellt euren Editor auf utf-8 (ohne BOM am besten), damit die Japanischen Zeichen und die Umlaute korrekt kopiert werden, damit ihr das Beispiel betrachten könnt.

Die Ausgabe sollte dann (im Seitenquelltext) so ausschauen:

mfg Balmung

Ein ähnliches Thema gab es doch schon mal.
Ist sogar von dir geschrieben: hybrid

jopp, ist aber bissel was anderes :slight_smile:

Hiho,
hab das Script mal kurzerhand auf meinen Webspace gepackt. Erstes Problem, wenn ich die Datei aufrufe, beschwert sich der Server aber, dass der Header zu spät käme. Dabei habe ich davor garkeine Ausgabe…

Auf einem payed-Space Server gibt es keine Meldung bzgl. des Headers, aber auch hier wird kein Bild ausgegeben. Statdessen sehe ich einen großen Zeichensalat :astonished:

Weiss jamend, was ich falsch mache? Getestet habe ich im IE 7, FF3 und Opera 9.6
==> Script auf dem Server:
webseite.v000nix.bplaced.net/Bil … igbild.php

Auf dem Paidserver wird vielleicht kein Fehler ausgegeben, weil der Fehler unterdrückt wurde.
Dass du den Zeichensalat siehst bedeutet, dass der header()-Befehl nicht korrekt ausgeführt wurde.
Der gleiche Fehler fand also auf beiden Servern statt, nur eben wurde der auf dem einem angezeigt, und auf dem anderem nicht :slight_smile:

Hast du die Datei mit UTF-8 Kodierung abgespeichert?

  • Wenn ja, dann schau in deinem Texteditor, ob es eine Möglichkeit gibt den BOM (Byte Order Mark) auszuschalten. Gibt es diese Möglichkeit nicht, solltest du deinen Editor wechseln :wink:

Hm ich hatte das auch schonmal, weiss aber nicht mehr genau was es war. Ist denn Imagemagic installiert??
Steht in deinem Script am anfang noch irgendetwas was nicht richtig auskommentiert wurde???

Die Datei war als UTF8 mit BOM abgespeichert. Jetzt weiss ich wenigstens, das es da einen Unterschied gibt. Danke vielmals! :winke:

Ich hab’s so gelöst:

[code] function StringToUnicode ($str)
{
$len = strlen ( $str );
$newstr = ‘’;
for ($i = 0; $i < $len; $i++) {
if (ord($str[$i]) >= 160)
$newstr = $newstr.’&#’.ord($str[$i]).’;’;
else
$newstr = $newstr.$str[$i];
}
return ($newstr);
}

imagettftext ($image, $TextSize, 0, 20, 60, $TextColor, $font, StringToUnicode (“Mein Bärenstarkes Tästing”));
[/code]

Dann klappt’s auch mit imagettftext()…