2013-09-10 2 views
0

Я пытаюсь написать TIFF изображения с помощью окна рисования персонажей, но все персонажей в вопросе проявляются как: this imageсимволов Unicode не рендеринг с PIL ImageFont

Окна рисовать символы (например, «┌─┐│ └┘╞═╡╤╧╘╛ ") были вставлены непосредственно в исходный код, и они корректно отображаются при сохранении в текстовом файле, но я не понимаю, почему они не отображаются на изображении.

Вот пример кода, я использую для рисования изображения:

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

Я использую питона версии 2.7.2 на Windows 7.

ответ

5

Я не уверен, это ваша проблема, потому что есть несколько способов получить это, поэтому я рассмотрю все возможности:

Сначала убедитесь, что файл фактически сохранен как UTF-8. По умолчанию Notepad и многие другие редакторы будут сохранять файлы в вашей системной кодировке, что, вероятно, похоже на cp1252. Тестирование, что «это выглядит правильно» и «когда сценарий записывает эти символы в файл, и я открываю этот файл в« Блокноте », он выглядит правильно» ничего не говорит вам; очевидно, если вы сохраните файл cp1252 и откройте его как cp1252, он выглядит правильно.

Простое добавление «coding = utf-8» в начало не изменяет магию изменения файла (кроме нескольких интеллектуальных редакторов, таких как emacs). Это просто говорит Python, что «этот исходный файл UTF-8», даже если это действительно что-то другое. Итак, Python заканчивает интерпретацию вашего cp1252 как UTF-8 и получение mojibake, как a-with-circumflex вместо символа рисования линии.

Обычно вам лучше использовать явные обратные слэш-образы, например \u250c, а не ┌─, особенно если вы даже не знаете, как определить, является ли файл UTF-8, а тем более как его исправить.

Во-вторых, вы почти никогда не хотите ставить символы, отличные от ASCII, в литерал str; используйте литерал unicode, если у вас нет веских оснований для этого.

Кроме того, если вы пройдете draw.text a str, PIL расшифрует его с помощью вашей кодировки по умолчанию, что опять же, вероятно, не UTF-8. Таким образом, даже если все остальное до сих пор было правильным, ваш код будет передавать некоторые UTF-8, которые будут обрабатываться как cp1252, поэтому mojibake снова. Использование литерала unicode полностью устранило бы эту проблему; в противном случае вам необходимо пройти text.decode('utf-8').

Собираем все вместе:

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

И теперь декларация кодирования и фактическое кодирование используется для сохранения файла не имеет значения, потому что файл чистый ASCII.

Но вы все равно можете получить недостающие символы, потому что многие шрифты не имеют символов рисования линии. Я не знаю, что ваш cour.ttf, но я нашел два шрифта Courier TTF в моей системе, один из старой Mac OS и один из Windows XP, и ни один из них не имеет их. Если это ваша проблема, вам, очевидно, нужно использовать другой шрифт.

Еще одна возможность: если вы все еще получаете mojibake с исправлениями выше, cour.ttf может не быть файлом шрифта, упорядоченным в Юникоде, но одним из старых заказов TTF. Средство просмотра шрифтов должно показать вам порядок TTF файла. (Я уверен, что Windows поставляется с одним, но я понятия не имею, где он находится в Windows 7 или как его использовать.) Затем вам нужно передать правильную вещь вместо 'unic' как encoding при загрузке шрифта. Но большинство шрифтов, которые не являются unic или symb, вероятно, не будут иметь символов рисования линий.

+2

Проблема заключалась в том, что нужно отправить рисование в виде юникода. Постановка u перед цитируемым текстом исправила проблему. – CCKx

+0

Не было проблем с вводом символов непосредственно в исходный файл. Я думаю, что намного проще закодировать этот путь. Хотя я только что узнал сегодня, что мне пришлось изменить настройки по умолчанию в Notepad ++ для создания новых файлов в формате UTF-8, прежде чем он даже позволит мне вставить его. – CCKx

+0

@CCKx: Да, если вы знаете, как убедиться, что ваш редактор использует UTF-8, и как проверить файл, чтобы увидеть, действительно ли это UTF-8, и использовать только литералы 'unicode', это безопасно используйте в своем источнике символы, отличные от ASCII. (По-прежнему стоит знать, как использовать обратную косую черту для отладки и пытаться использовать ее при запуске задач mojibake, чтобы исключить проблемы с кодировкой источника.) – abarnert

Смежные вопросы