Я пытаюсь нарисовать символы Unicode, используя PyCDC.DrawText(), но вместо этого он нарисовал два символа ASCII. Например, при попытке нарисовать 'Я' (\ u042F), я получаю: http://i.stack.imgur.com/hh9RJ.png
Моя строка определяется как строка Unicode:
text = u'Я'
И файл начинается с:
# -*- coding:utf-8 -*-
Я также попробовал напечатать строку (на консоли), и это получилось прекрасно, поэтому проблема, вероятно, лежит в реализации DrawText().
Благодарю!
Чтобы вывести текст 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.
Дэвид: "Эти функции, безусловно, должны быть доступны через PyWin32", на самом деле это не так.
После десятков часов поиска, пытаясь выяснить, где в win32ui
, win32gui
и т.д. Может быть скрытый TextOutW
, написание моего собственного расширения C, которое имело другие недостатки, поэтому не могло его использовать, написав внешнюю прог. вызванный изнутри python только для того, чтобы узнать, что ручки HDC
нельзя передать другим процессам, я, наконец, наткнулся на это однострочное элегантное запрограммированное решение на основе ctypes
как было предложено выше:
TextOutW
или аналогичная функция, с которой вы были связаны с Windows gdi c. Несмотря на то, что существует функция win32gdi.DrawTextW
которая работает точно так же, как и для win32gdi.DrawTextW
окон, но иногда вам нужно специально использовать, например, TextOut
, ExtTextOut
и т. W
Которые недоступны в версиях Unicode W
-suffixed в pywin32
win32gdi
для достижения этого, вместо использования ограниченных функций 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 ...
Получайте удовольствие от этого