Невозможно рисовать символы Юникода с Python PyCDC.DrawText () - PullRequest
1 голос
/ 28 августа 2011

Я пытаюсь нарисовать символы Юникода, используя PyCDC.DrawText (), но вместо этого кажется, что вместо этого рисуются два символа ASCII Например, при попытке нарисовать 'Я' (\ u042F) я получаю: http://i.stack.imgur.com/hh9RJ.png

Моя строка определяется как строка в Юникоде:

text = u'Я'

И файл начинается с:

# -*- coding:utf-8 -*-

Я также попытался напечатать строку (на консоль), и она вышла нормально, поэтому проблема, вероятно, заключается в реализации DrawText ().

Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 августа 2011

Для вывода текста Unicode в Windows вам необходимо закодировать его в UTF-16 и вызвать версию широких символов DrawText() или TextOut() Win32.Если вы не знакомы, Windows API изначально UTF-16 и имеет параллельные 8-битные версии ANSI для поддержки предыдущих версий.

Я ничего не знаю об используемой вами оболочке Win32, но скорее подозреваю, что PyCDC.DrawText()вызывает версию ANSI любой из этих функций Win32, которая выполняет свою работу.Ваше решение, скорее всего, будет связано с поиском способа вызвать DrawTextW() или TextOutW().Вы можете сделать это с помощью ctypes, и эти функции, безусловно, должны быть доступны и через PyWin32.

Однако я, вероятно, выберу что-то более высокое, например PyQt.

0 голосов
/ 20 августа 2013

Дэвид: «эти функции, безусловно, должны быть доступны через PyWin32», на самом деле их нет.

После десятков часов поиска, пытаясь выяснить, где в пределах win32ui, win32gui и т. Д.там может быть скрытый TextOutW, пишущий мое собственное расширение C с другими недостатками, поэтому я не могу его использовать, пишу внешнюю прогу.Вызванный из Python только для того, чтобы выяснить, что HDC дескрипторы не могут быть переданы другим процессам, я наконец наткнулся на это однострочное элегантное запрограммированное решение, основанное на ctypes, как предложено выше:

  1. вам нужна TextOutW или аналогичная функция, к которой вы привыкли из windows gdi c.Хотя есть функция с именем win32gdi.DrawTextW, которая работает точно так же, как аналог Windows, все же иногда вам нужно специально использовать, например, TextOut, ExtTextOut и т. Д., Которые недоступны в версиях с поддержкой юникода W в pywin32 win32gdi
  2. для достижения этой цели вместо использования ограниченных функций win32gui используйте windll.gdi32.TextOutW, доступный из ctypes:

    from ctypes import *
    import win32gdi
    
    # init HDC
    # set hdc to something like 
    hdc = win32gdi.CreateDC(print_processor, printername, devmode)
    
    # here comes the ctypes function that does your deal
    text = u'Working! \u4e00\u4e01'
    windll.gdi32.TextOutW(hdc, x, y, text, len(text))
    
    # ... continue your prog ...
    

Веселитесь с этим

...