2010-09-19 6 views
6

Ich arbeite derzeit mit einem vorhandenen Modul, das eine C++ - Schnittstelle bereitstellt und einige Operationen mit Zeichenfolgen ausführt.Python: Übergabe der Unicode-Zeichenfolge an C++ - Modul

Ich musste leider Unicode-Strings und das Modul verwenden, hat keine Unterstützung für eine Unicode-Schnittstelle, so schrieb ich eine zusätzliche Funktion zur Schnittstelle hinzuzufügen:

void SomeUnicodeFunction(const wchar_t* string) 

Allerdings, wenn ich versuche, verwenden Sie den folgenden Code in Python:

SomeModule.SomeUnicodeFunction(ctypes.c_wchar_p(unicode_string)) 

ich diesen Fehler:

ArgumentError: Python argument types in 
    SomeModule.SomeUnicodeFunction(SomeModule, c_wchar_p) 
did not match C++ signature: 
    SomeUnicodeFunction(... {lvalue}, wchar_t const*) 

(Namen wurden geändert).

Ich habe versucht, wchar_t im C++ - Modul zu Py_UNICODE ohne Erfolg zu ändern. Wie löse ich dieses Problem?

+0

Boost.python erkennt die Ctypes-Typen nicht automatisch, soweit ich weiß, aber es sollte wahrscheinlich nur mit eingebauten Unicode-Strings funktionieren. Was passiert, wenn Sie versuchen, 'SomeModule.SomeUnicodeFunction (unicode_string)' aufzurufen? – Doug

+0

@Tough: derselbe Fehler, aber mit "Unicode" anstelle von "C_Wchar_p" als Python-Argumenttyp. –

+0

@Matthew, w/oder ohne 'c_wchar_p' Cast, es sieht so aus, als ob _should_ funktionieren sollte, außer vielleicht für die' const' (die nirgends in 'ctypes' 'docs erwähnt wird) - was passiert, wenn Sie das' 'weglassen const "im C-Code? (Beachten Sie, dass es keine direkte C++ - Unterstützung in 'ctypes' gibt: Die Funktion muss natürlich' extern C' aus C++ - Sicht sein). –

Antwort

2

Für Linux müssen Sie Ihre API nicht ändern, nur tun:

SomeModule.SomeFunction(str(s.encode('utf-8'))) 

unter Windows alle Unicode-APIs UTF-16 LE (Little Endian), so dass Sie verwenden es auf diese Weise zu kodieren haben:

SomeModule.SomeFunctionW(str(s.encode('utf-16-le'))) 

Gut zu wissen: wchar_t verschiedenen Größen auf unterschiedlichen Plattformen haben: 8, 16 oder 32 Bit.

+0

Ich benutze eigentlich Linux. Ich habe meine eigene Antwort auf die Frage aktualisiert. –

2

einen Hack gefunden, um das Problem zu umgehen:

SomeModule.SomeUnicodeFunction(str(s.encode('utf-8'))) 

Es scheint für meine Zwecke bisher adaequat zu sein.

Update: Eigentlich, ich benutze UTF-8 bedeutet, ich vermeide jede Notwendigkeit für SomeUnicodeFunction und kann den Standard-SomeFunction ohne Spezialisierung für Unicode verwenden. Lerne jeden Tag etwas Neues :).

Verwandte Themen