Los caracteres Unicode no se procesan con PIL ImageFont

Estoy tratando de escribir imágenes tiff usando caracteres de dibujo de cuadro, pero todos los personajes en cuestión aparecen como: esta imagen

Los caracteres del cuadro (por ejemplo, “┌─┐│└┘╞═╡╤╧╘╛”) se pegaron directamente en el código fuente, y se muestran correctamente cuando se guardan en un archivo de texto, pero no entiendo por qué No estás apareciendo en la imagen.

Aquí hay un ejemplo del código que estoy usando para dibujar la imagen:

# 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") 

Estoy usando la versión 2.7.2 de Python en Windows 7.

No estoy seguro de cuál de estos es tu problema, porque hay varias maneras de obtener esto, así que repasaré todas las posibilidades:

Primero, asegúrese de que el archivo se guarde como UTF-8. De forma predeterminada, el Bloc de notas y muchos otros editores guardarán los archivos en la encoding de su sistema, que probablemente sea algo como cp1252. Probar que “se ve bien” y “cuando la secuencia de comandos escribe esos caracteres en un archivo y abro ese archivo en el Bloc de notas, parece correcto” no le dice nada; Obviamente, si guarda un archivo cp1252 y lo abre como cp1252, se ve bien.

El simple hecho de agregar “coding = utf-8” a la parte superior no cambia de manera mágica la forma en que se guarda el archivo (excepto con algunos editores inteligentes, como emacs). Simplemente le dice a Python que “este archivo fuente es UTF-8”, incluso si realmente es otra cosa. Entonces, Python termina interpretando tu cp1252 como UTF-8 y obteniendo un mojibake, como un circunflejo en lugar de un personaje de dibujo de líneas.

Por lo general, es mejor utilizar escapes de barra invertida explícitos, como \u250c lugar de ┌─ , especialmente si ni siquiera sabe cómo saber si el archivo es UTF-8, y mucho menos cómo solucionarlo.

En segundo lugar, casi nunca desea colocar caracteres no ASCII en un str literal; use un literal de unicode menos que tenga una buena razón para hacer lo contrario.

Además de eso, si pasas draw.text a str , PIL lo decodificará con tu juego de caracteres predeterminado, que probablemente no sea UTF-8. Entonces, incluso si todo lo demás hasta ahora fuera correcto, su código estaría entregando un poco de UTF-8 para que se analice como cp1252, así que vuelva a mojibake. El uso de un literal unicode evitaría este problema por completo; de lo contrario, debe pasar text.decode('utf-8') .

Poniendo todo junto:

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

Y ahora no importan la statement de encoding y la encoding real utilizada para guardar el archivo, porque el archivo es ASCII puro.

Pero aún puede obtener los rectangularjs de caracteres faltantes, porque muchas fonts no tienen los caracteres de dibujo de línea. No sé cuál es tu cour.ttf , pero encontré dos fonts Courier TTF en mi sistema, una de un sistema operativo Mac antiguo y otra de Windows XP, y ninguna de ellas la tiene. Si ese es tu problema, obviamente necesitas usar una fuente diferente.

Otra posibilidad: si aún está obteniendo un mojibake con los arreglos anteriores, cour.ttf posible que cour.ttf no sea un archivo de fuente ordenado por Unicode, sino uno de los pedidos TTF más antiguos. Un visor de fonts debería mostrarle el orden TTF del archivo. (Estoy bastante seguro de que Windows viene con uno, pero no tengo idea de dónde está en Windows 7 o cómo usarlo). Luego, debe pasar lo correcto en lugar de 'unic' como la encoding al cargar la fuente. . Pero la mayoría de las fonts que no son symb o symb probablemente no tengan los caracteres de dibujo de línea de todos modos.