3

ボックス描画文字を使用して tiff 画像を書き込もうとしていますが、問題の文字はすべて次のように表示されます。この画像

ボックス描画文字 (例: "┌─┐│└┘╞═╡╤╧╘╛") はソース コードに直接貼り付けられ、テキスト ファイルに保存すると正しく表示されますが、なぜそうなるのかわかりません。画像に表示されません。

画像を描画するために使用しているコードの例を次に示します。

# coding=utf-8
text = "┌─┐│└┘╞═╡╤╧╘╛"
from PIL import Image, ImageDraw, ImageFont, TiffImagePlugin
img = Image.new("1",(1200,1600),1)
font = ImageFont.truetype("cour.ttf",14,encoding="unic")
draw = ImageDraw.Draw(img)
draw.text((40,0), text, font=font, fill=0)
img.save("imagefile.tif","TIFF")

Windows 7でpythonバージョン2.7.2を使用しています。

4

1 に答える 1

8

これを取得するには複数の方法があるため、これらのどれが問題なのかわかりません。そのため、すべての可能性について説明します。

まず、ファイルが実際に UTF-8 として保存されていることを確認します。デフォルトでは、メモ帳やその他の多くのエディタはファイルをシステム エンコーディングで保存します。これはおそらく cp1252 のようなものです。「正しく見える」、「スクリプトがこれらの文字をファイルに書き込んで、そのファイルをメモ帳で開くと、正しく見える」というテストを行っても、何もわかりません。明らかに、cp1252 ファイルを保存して cp1252 として開くと、正しく表示されます。

先頭に「coding=utf-8」を追加するだけでは、ファイルの保存方法が魔法のように変わることはありません (emacs などのいくつかのスマートなエディターを除く)。実際には別のものであっても、「このソースファイルは UTF-8 です」と Python に伝えるだけです。そのため、Python は cp1252 を UTF-8 として解釈し、線画文字の代わりに a-with-circumflex のように文字化けします。

特に、ファイルが UTF-8 であるかどうかを確認する方法さえわからない場合は、修正方法はなおさらです\u250c┌─

str第二に、ASCII 以外の文字をリテラルに入れたいと思うことはほとんどありません。unicode正当な理由がない限り、リテラルを使用してください。

その上、 を渡すdraw.textstr、PIL はそれをデフォルトの文字セット (おそらく UTF-8 ではない) でデコードします。したがって、これまでのすべてが正しかったとしても、コードは cp1252 として解析される UTF-8 を渡していたので、もう一度 mojibake します。unicodeリテラルを使用すると、この問題を完全に回避できます。それ以外の場合は、渡す必要がありますtext.decode('utf-8')

それをすべてまとめると:

text = u"\u250c\u2500\u2510\u2502\u2514\u2518\u255e\u2550\u2561\u2564\u2567\u2558\u255b"

ファイルは純粋な ASCII であるため、ファイルの保存に使用されるコーディング宣言と実際のエンコーディングは重要ではありません。

ただし、多くのフォントには線画文字がないため、文字のない四角形が表示される場合があります。あなたのフォントが何かはわかりませんがcour.ttf、私のシステムには 2 つの Courier TTF フォントが見つかりました。1 つは古い Mac OS のもので、もう 1 つは Windows XP のもので、どちらにもありません。それが問題である場合は、明らかに別のフォントを使用する必要があります。

もう 1 つの可能性: 上記の修正を行ってもまだ mojibake を取得している場合、それcour.ttfは Unicode 順のフォント ファイルではなく、古い TTF 順の 1 つである可能性があります。フォント ビューアに、ファイルの TTF 順序が表示されます。(Windowsには1つ付属していると確信していますが、Windows 7のどこにあるのか、どのように使用するのかわかりません。)次に、フォントをロードするときに'unic'as の代わりに正しいものを渡す必要があります。encodingしかし、ほとんどのフォントには線描画文字が含まれていないかunicsymbおそらく含まれていません。

于 2013-09-10T22:03:40.827 に答える