Frage

Ich verwende den PHP -Funktion imagettftext (), um Text in ein GIF -Bild zu konvertieren. Der von mir konvertierende Text enthält Unicode -Zeichen, einschließlich Japanisch. Alles funktioniert gut auf meiner lokalen Maschine (Ubuntu 7.10), aber auf meinem Webhost -Server sind die japanischen Charaktere verstümmelt. Was könnte den Unterschied verursachen? Alles sollte als UTF-8 codiert werden.

Auf dem Webhost -Server defektes Bild:http://www.ibeni.net/flashcards/imagetest.php

Kopie des richtigen Bildes von meiner lokalen Maschine:http://www.ibeni.net/flashcards/imagetest.php.gif

Kopie von phpinfo () von meiner lokalen Maschine:http://www.ibeni.net/flashcards/phpinfo.php.html

Kopie von Phpinfo () aus meinem Webhost -Server:http://example5.nfshost.com/phpinfo

Code:

mb_language('uni');
mb_internal_encoding('UTF-8');

header('Content-type: image/gif');

$text = '日本語';
$font = './Cyberbit.ttf';

// Create the image
$im = imagecreatetruecolor(160, 160);
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

// Create some colors
imagefilledrectangle($im, 0, 0, 159, 159, $white);

// Add the text
imagettftext($im, 12, 0, 20, 20, $black, $font, $text);
imagegif($im);
imagedestroy($im); 
War es hilfreich?

Lösung

Hier ist die Lösung, die endlich für mich funktioniert hat:

$text = "你好";
// Convert UTF-8 string to HTML entities
$text = mb_convert_encoding($text, 'HTML-ENTITIES',"UTF-8");
// Convert HTML entities into ISO-8859-1
$text = html_entity_decode($text,ENT_NOQUOTES, "ISO-8859-1");
// Convert characters > 127 into their hexidecimal equivalents
$out = "";
for($i = 0; $i < strlen($text); $i++) {
    $letter = $text[$i];
    $num = ord($letter);
    if($num>127) {
      $out .= "&#$num;";
    } else {
      $out .=  $letter;
    }
}

Die Konvertierung der Zeichenfolge in HTML -Entitäten funktioniert außer dass der Funktion imagettftext () benannte Entitäten nicht akzeptiert. Zum Beispiel,

&#26085;&#26412;&#35486;

ist ok, aber

&ccedil;

ist nicht. Die Konvertierung in ISO-8859-1 konvertiert die genannten Entitäten zurück in Zeichen, aber es gibt ein zweites Problem. ImagettFtext () unterstützt keine Zeichen mit einem Wert von mehr als> 127. Der letzte For-Loop codiert diese Charaktere in Hexadezimal. Diese Lösung arbeitet für mich mit dem Text, den ich verwende (beinhaltet japanische, chinesische und akzentuierte lateinische Charaktere für Portugiesisch), aber ich bin mir nicht zu 100% sicher, dass sie in allen Fällen funktionieren wird.

Alle diese Gymnastik werden benötigt, weil ImagettFtext () UTF-8-Zeichenfolgen auf meinem Server nicht wirklich akzeptiert.

Andere Tipps

Ich hatte das gleiche Problem mit einem Skript, das Text in einem Bild rendert und es ausgibt. Das Problem war, dass ich aufgrund verschiedener Browser (oder Code -Härte/Paranoia, welcher Art, wie Sie darüber nachdenken möchten), keine Möglichkeit hatte zu wissen, was Codierung in die gestellt wurde $_GET Array.

So habe ich das Problem gelöst.

$item_text = $_GET['text'];

# detect if the string was passed in as unicode
$text_encoding = mb_detect_encoding($item_text, 'UTF-8, ISO-8859-1');
# make sure it's in unicode
if ($text_encoding != 'UTF-8') {
    $item_text = mb_convert_encoding($item_text, 'UTF-8', $text_encoding);
}

# html numerically-escape everything (&#[dec];)
$item_text = mb_encode_numericentity($item_text,
    array (0x0, 0xffff, 0, 0xffff), 'UTF-8');

Dies löst jedes Problem mit imagettftext Nicht in der Lage zu sein, Zeichen über #127 zu handhaben, indem alle Zeichen (einschließlich Multibyte -Unicode -Zeichen) einfach in ihre numerische HTML -Charaktereinheit geändert werden - "A" für "A", "B" für "B" usw. - was die Handbuch Seite Behauptungen, Unterstützung für.

Ich hatte das gleiche Problem. Die Konvertierung der Schrift vom OTF in TTF half. Sie können Fontforge (im Standard -Repository verfügbar) zum Konvertieren verwenden.

Mein Hauptverdächtiger ist die Schriftart, die Sie zum Rendern verwenden.

Entsprechend http://fr3.php.net/imagettftext, Verschiedene Versionen der von PHP verwendeten GD -Bibliothek können unterschiedliches Verhalten zeigen.

  • GD -Version auf Ihrer lokalen Maschine: 2.0 oder höher
  • GD -Version auf Ihrem Webhost -Server: gebündelt (2.0.34 kompatibel)

Bearbeiten:Eine andere Idee: Können Sie das überprüfen? $text = '日本語'; Ist wirklich so auf Ihrem Produktionsserver so gespeichert? Vielleicht gibt es ein Codierungsproblem mit Ihrem Skript.

Nächste Bearbeitung: BKB hat das bereits vorgeschlagen. Für den Fall, dass dies die Ursache ist: Er war zuerst mit der Antwort ;-)

Gibt es diese bestimmte Schriftartdatei auf Ihrem Produktionsgerät? Wenn Sie FTP zum Hochladen Ihrer Dateien verwenden, verwenden Sie eine binäre Codierung?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top