Невозможно рисовать символы Юникода с Python PyCDC.DrawText ()

1

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

Моя строка определяется как строка Unicode:

text = u'Я'

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

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

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

Благодарю!

  • 0
    о чем говорит документация PyCDC.DrawText? (Я не эксперт, но, учитывая, что вы не получите исключение, возможно, шрифт не поддерживает юникод?)
  • 0
    Ничего не говорит о Юникоде.
Показать ещё 3 комментария
Теги:
winapi
unicode
pywin32

2 ответа

3
Лучший ответ

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

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

Тем не менее, я бы выбрал более высокий уровень, например PyQt.

  • 0
    Спасибо Дэвид. Я сам пришел к аналогичному выводу: PyQt делает это с меньшими хлопотами.
0

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

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

  1. вам нужна TextOutW или аналогичная функция, с которой вы были связаны с Windows gdi c. Несмотря на то, что существует функция win32gdi.DrawTextW которая работает точно так же, как и для win32gdi.DrawTextW окон, но иногда вам нужно специально использовать, например, TextOut, ExtTextOut и т. W Которые недоступны в версиях Unicode W -suffixed в 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 ...
    

Получайте удовольствие от этого

Ещё вопросы

Сообщество Overcoder
Наверх
Меню