无法使用Python的PyCDC.DrawText()绘制Unicode字符

时间:2011-08-28 12:22:15

标签: python winapi unicode pywin32

我正在尝试使用PyCDC.DrawText()绘制Unicode字符,但它似乎绘制了两个ASCII字符。例如,在尝试绘制'Я'(\ u042F)时,我得到:http://i.stack.imgur.com/hh9RJ.png

我的字符串被定义为Unicode字符串:

text = u'Я'

文件以:

开头
# -*- coding:utf-8 -*-

我也试过打印字符串(到控制台),它很好,所以问题可能在于DrawText()的实现。

谢谢!

2 个答案:

答案 0 :(得分:3)

要在Windows上输出Unicode文本,您需要使用UTF-16对其进行编码,并调用DrawText()TextOut() Win32函数的宽字符版本。如果您不熟悉,Windows API本身就是UTF-16,并且具有并行的8位ANSI版本,可用于传统支持。

我对你正在使用的Win32包装器一无所知,而是怀疑PyCDC.DrawText()正在调用这些Win32函数正在进行工作的ANSI版本。您的解决方案可能需要找到一种方法来调用DrawTextW()TextOutW()。你可以用ctypes来做,这些函数肯定也可以通过PyWin32使用。

但是,我可能会选择更高级别的东西,比如PyQt。

答案 1 :(得分:0)

大卫:“实际上,这些功能肯定可以通过PyWin32实现,但事实并非如此。

经过几十个小时的搜索,试图找出win32uiwin32gui等内的位置,可能会有一个隐藏的TextOutW,编写我自己的C扩展,其他有瑕疵因此无法使用它,编写外部编程。从python中调用只是为了发现HDC句柄不能转移到其他进程,我终于偶然发现了这个基于ctypes的单线优雅的预编程解决方案,如上所述:

  1. 您需要使用{gid}中的TextOutW或类似功能。虽然有一个名为win32gdi.DrawTextW的函数与windows对应函数完全相同,但有时你需要特别使用例如在TextOut的{​​{1}}
  2. 中,ExtTextOutW等在pywin32的后缀版本中无法使用win32gdiwin32gui
  3. 要实现这一目标,请使用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 ... 函数:

    {{1}}
  4. 玩得开心