我正在尝试使用PyCDC.DrawText()绘制Unicode字符,但它似乎绘制了两个ASCII字符。例如,在尝试绘制'Я'(\ u042F)时,我得到:http://i.stack.imgur.com/hh9RJ.png
我的字符串被定义为Unicode字符串:
text = u'Я'
文件以:
开头# -*- coding:utf-8 -*-
我也试过打印字符串(到控制台),它很好,所以问题可能在于DrawText()的实现。
谢谢!
答案 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实现,但事实并非如此。
经过几十个小时的搜索,试图找出win32ui
,win32gui
等内的位置,可能会有一个隐藏的TextOutW
,编写我自己的C扩展,其他有瑕疵因此无法使用它,编写外部编程。从python中调用只是为了发现HDC
句柄不能转移到其他进程,我终于偶然发现了这个基于ctypes
的单线优雅的预编程解决方案,如上所述:
TextOutW
或类似功能。虽然有一个名为win32gdi.DrawTextW
的函数与windows对应函数完全相同,但有时你需要特别使用例如在TextOut
的{{1}} ExtTextOut
,W
等在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 ...
函数:
{{1}}
玩得开心