0

Python プログラムを使用して、Excel .xls ファイルから一連の非西洋 (日本語/中国語) Unicode 文字列を読み取り、各文字列の画像ファイルを作成しようとしています。xlrd モジュールは、適切に表示されている Excel ファイルから Unicode 文字列を提供します。

の質問への回答では、Python で Windows API を使用して通常の西洋のテキストを画像ファイルにレンダリングするためのいくつかの基本的な要素が提供されました。ただし、Unicode テキスト文字列から 2 つの日本語文字をレンダリングする基本的な呼び出しに変更すると、次のようになります。

f = Win32Font("MS Gothic", 24)
im = f.renderText(u'\u30bb\u30c3')
im.save("hope.png")

コードは失敗します:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

Windows API を使用して Unicode 文字列を適切にレンダリングするための助けをいただければ幸いです。

4

3 に答える 3

0

Win32ApiのUnicodeバージョンを使用する必要があります。他の質問からのリンクを一目見れば、少なくとも実装ではwin32gui.DrawTextWなく必要です。win32 g uiは、ラップするMFCAPIではなくネイティブAPIであることに注意してください。ドキュメントをざっと見てみると、UnicodeバージョンのMFC呼び出しを使用する方法がわかりませんでした。そのため、ネイティブAPIで使用するには、使用からネイティブハンドルを取得する必要があります。win32ui.DrawTextWin32Fontwin32uipywin32PyCDCGetSafeHdc

それ以上のヘルプが必要な場合は、完全な例を投稿してください。

于 2012-06-28T03:21:04.993 に答える
0

Unicode ...W win32... 関数を探すのに何十時間も費やしましたが、Mark Tolonen による回答が得られました。コードが以下に続く実際の例にすぐに実装しました。すべてがうまくいけば、プリンターは文字列「汉字、にほんご、עברית、عربي我都会刷出。」を出力するはずです。

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

import win32ui, win32con, win32gui, win32print, traceback

# init, bla bla bla
printername = win32print.GetDefaultPrinter()
hprinter = win32print.OpenPrinter(printername)
# load default settings
devmode = win32print.GetPrinter(hprinter, 8)["pDevMode"]
# this is where it gets INTERESTING:
# after the following two lines, use:
# dc for win32ui calls like LineTo, SelectObject, ...
# hdc for DrawTextW, your *MAGIC* function that supports unicode output
hdc = win32gui.CreateDC("WINSPOOL", printername, devmode)
dc = win32ui.CreateDCFromHandle(hdc)

# 1440 twips = 1 inch
dc.SetMapMode(win32con.MM_TWIPS)
# 20 twips = 1 pt
scale_factor = 20

# start the document, description as unicode
description = u'Test1'
dc.StartDoc(description)

# when working with the printer, enclose any potentially failing calls within a try block,
# because if you do not properly end the print job (see bottom), after a couple of such failures,
# you might need to restart windows as it runs out of handles or something and starts
# behaving in an unpredictable way, some documents fail to print, you cannot open windows, etc.

try :

    # Use a font
    font = win32ui.CreateFont({
        "name": "Arial Unicode MS", # a font name
        "height": int(scale_factor * 10), # 10 pt
        "weight": 400, # 400 = normal
    })

    # use dc -- SelectObject is a win32ui call
    dc.SelectObject(font)

    # this is the miracle where the unicode text gets to be printed; notice hdc,
    # not dc, for DrawTextW uses a different handle, i have found this in other posts
    win32gui.DrawTextW (hdc, u"\u6C49\u5B57\u3001\u306B\u307B\u3093\u3054\u3001\u05E2\u05D1\u05E8\u05D9\u05EA\u3001\u0639\u0631\u0628\u064A\u6211\u90FD\u4F1A\u5237\u51FA\u3002", -1, (0, -2000, 4000, -4000), win32con.DT_CENTER)

except :
    traceback.print_exc()

# must not forget to tell Windows we're done. This line must get called if StartDoc 
# was called, if you fail to do so, your sys might start behaving unexpectedly
dc.EndDoc()
于 2013-04-20T19:30:56.827 に答える