[Python-de] MSWord-Automation mit python 2.1 -- Fehler mit Text-Selection() und Umlauten

M.-A. Lemburg mal at lemburg.com
Wed Dec 19 10:19:26 EST 2001


Janos BEKESI wrote:
> 
> Hi all,
> 
> falls es jemanden interessiert:
> beim Arbeiten mit M$ Word 97 und win32com (von Hammond) ist mir
> folgendes aufgefallen:
> 
> die Funktion str(WordApp.Selection()) [ WordApp=die MSWord-
> Instanz, die vom script erzeugt/verwendet wird; Selection=
> gewählter Text ] funktioniert nicht bei Umlauten (ASCII > 128).

Das liegt daran, daß WordApp.Selection() Unicode liefert.
Versuch mal .encode('latin-1').
 
> Eine (provisorische) Lösung dafür hab ich aber gefunden:
> 
> Voraussetzung dafür ist, daß es eine Datei gibt, die mit dem
> COM make_py-utility (z.b. in pythonwin) erzeugt wurde (die Type
> Library "Microsoft Word 8.0 Object Library" -- steht auch im
> Header der Datei) und im Verzeichnis win32com/gen_py liegt (mit
> einer ellenlangen ID als Namen).
> 
> In dieser Datei muss man ca. ab Zeile 9162 folgendes einfügen:
> 
> # ----- original code: ----------------------------
> # Default property for this class is 'Text'
> def __call__(self):
>     return apply(self._ApplyTypes_, (0, 2, (8, 0), (), "Text",
>          None) )
> # str(ob) and int(ob) will use __call__
> def __str__(self, *args):
>     try:
>         return str(apply( self.__call__, args))
>     except pythoncom.com_error:
>           return repr(self)
> # ----- einzufügen: -------------------------------
>     except UnicodeError:
>         import codecs
>         return codecs.latin_1_encode(apply(self.__call__, args),
>             'replace')[0]
> # ------ end code ---------------------------------
> 
> Bei dieser Notlösung werden allerdings osteuropäische etc.
> Zeichen, die nicht im latin-1 Zeichensatz enthalten sind, durch
> ein "?" ersetzt.
> 
> Alternativ könnte man sich auch utf-8 zurückgeben lassen, dann
> heißt der einzufügende Code:
> 
> # ----- einzufügen: -------------------------------
>     except UnicodeError:
>         import codecs
>         return codecs.utf_8_encode(apply(self.__call__,
>             args))[0]
> # ------ end code ---------------------------------
> 
> Wie man das aber weiterverarbeitet, weiß ich selber noch nicht.

Zu umständlich... u.encode('latin-1') oder u.encode('utf-8')
erledigt das besser.

-- 
Marc-Andre Lemburg
CEO eGenix.com Software GmbH
______________________________________________________________________
Company & Consulting:                           http://www.egenix.com/
Python Software:                   http://www.egenix.com/files/python/



More information about the Python-de mailing list