Das Problem ist Sie ImageMagick die Ausgabe eines "Splitter" (wordWrapAnnotation
) füttern, zu der Sie utf8_decode
ing die Texteingabe. Dies ist mit Sicherheit falsch, wenn Sie mit chinesischem Text zu tun haben. utf8_decode
kann nur mit UTF-8-Text umgehen, der in ISO-8859-1 (die gebräuchlichste 8-Bit-Erweiterung von ASCII) konvertiert werden kann.
Jetzt hoffe ich, dass Sie Text UTF-8 codiert ist. Wenn dies nicht der Fall, könnten Sie in der Lage sein, es so zu konvertieren:
$text = mb_convert_encoding($text, 'UTF-8', 'BIG-5');
oder ähnliche
$text = mb_convert_encoding($text, 'UTF-8', 'GB18030'); // only PHP >= 5.4.0
(im Code $text
sind eher $text1
und $text2
).
Dann gibt es (mindestens) zwei Dinge in Ihrem Code zu beheben:
- den Text übergeben "wie er ist" (ohne
utf8_decode
) zu wordWrapAnnotation
,
- Änderung des Argument von
setTextEncoding
von "utf-8"
zu "UTF-8"
nach specs
ich hoffe, dass alle Variablen in Ihrem Code in einigen fehlt ein Teil davon initialisiert werden. Mit den beiden obigen Änderungen (die zweite ist vielleicht nicht notwendig, aber Sie wissen nie ...), und mit den fehlenden Teilen an Ort und Stelle, sehe ich keinen Grund, warum Ihr Code nicht funktionieren sollte, es sei denn Ihre TTF-Datei ist kaputt oder die Imagick
Bibliothek ist kaputt (imagemagick
, auf der Imagick
basiert, ist eine große Bibliothek, so halte ich diese letzte Möglichkeit eher unwahrscheinlich).
EDIT:
Ihre Anfrage Nach, ich meine Antwort aktualisieren mit
a) die Tatsache, dass mb_internal_encoding('utf-8')
Einstellung für die Lösung sehr wichtig ist, wie Sie in Ihrem answer sagen, und
b) mein Vorschlag für einen besseren Liniensplitter, der für westliche Sprachen und für Chinesisch akzeptabel funktioniert, und das ist wahrscheinlich ein guter Ausgangspunkt für andere Sprachen mit Han-Logogrammen (japanisches Kanji und koreanisches Hanja):
In Worten: Die Eingabe wird zuerst bereinigt, indem alle Whitespaces, einschließlich Zeilenumbrüche, durch ein einzelnes Leerzeichen ersetzt werden, mit Ausnahme von führenden und nachfolgenden Whitespaces, die entfernt werden. Dann wird es entweder in Leerzeichen oder direkt vor Han-Zeichen aufgeteilt, denen keine "führenden" Zeichen vorangestellt sind (wie öffnende Klammern oder öffnende Anführungszeichen) oder direkt vor "führenden" Zeichen. Zeilen werden so zusammengestellt, dass sie nicht mehr als $maxWidth
Pixel horizontal gerendert werden, außer wenn dies durch die Aufteilungsregeln nicht möglich ist (in diesem Fall wird das endgültige Rendering wahrscheinlich überlaufen). Eine Modifikation, um das Aufteilen in Überlauffälle zu erzwingen, ist nicht schwierig. Beachten Sie, dass z. B. chinesische Interpunktionszeichen in Unicode nicht als Han klassifiziert werden, so dass mit Ausnahme der "führenden" Interpunktionszeichen keine Zeilenumbrüche vor dem Algorithmus eingefügt werden können.
chinesischer Text? Wie wäre es, zuerst eine Grafik der chinesischen Symbole zu erstellen und diese dann auf das Bild zu übertragen? – hakre
Wie gehe ich dabei vor? –
Nun, für jedes chinesische Schriftzeichen, erstellen Sie ein Bild, das es anzeigt. Dann fügen Sie diese Bilder zum Beispiel zusammen. Möglicherweise nicht die beste Methode, aber möglicherweise erspart Ihnen das Problem, tatsächlich einige chinesische Schriftarten zu verwenden. – hakre