我通過使用靜態wxString::FromUTF8()
函數將Python從Python轉換爲wxString,並將wxString.ToUTF8()
轉換爲其他方向,從而實現了它的功能。以下是我想出了代碼:
# Import the parts of wxString we want to use.
cdef extern from "wx/string.h":
cdef cppclass wxString:
char* ToUTF8()
# Import useful static functions from the class.
cdef extern from "wx/string.h" namespace "wxString":
wxString FromUTF8(char*)
# Function to convert from Python string to wxString. This can be given either
# a unicode string, or a UTF-8 encoded byte string. Results with other encodings
# are undefined and will probably lead to errors.
cdef inline wxString from_python(python_string):
# If it is a Python unicode string, encode it to a UTF-8 byte string as this
# is how we will pass it to wxString.
if isinstance(python_string, unicode):
byte_string = python_string.encode('UTF-8')
# It is already a byte string, and we have no choice but to assume its valid
# UTF-8 as theres no (sane/efficient) way to detect the encoding.
else:
byte_string = python_string
# Turn the byte string (which is still a Python object) into a C-level char*
# string.
cdef char* c_string = byte_string
# Use the static wxString::FromUTF8() function to get us a wxString.
return FromUTF8(c_string)
# Function to convert a wxString to a UTF-8 encoded Python byte string.
cdef inline object to_python_utf8(wxString wx_string):
return wx_string.ToUTF8()
# Function to convert a wxString to a Python unicode string.
cdef inline object to_python_unicode(wxString wx_string):
# Since the wxString.ToUTF8() method returns a const char*, we'd have to try
# and cast it if we wanted to do it all in here. I've tried this and can't
# seem to get it to work. But calling the to_python_utf8() function
# means Cython handles the conversions and it all just works. Plus, since
# they are defined as inline functions this may well be simplified down when
# compiled.
byte_string = to_python_utf8(wx_string)
# Decode it to a unicode string and we're done.
return byte_string.decode('UTF-8')
簡單地說這在.pxd文件(就個人而言,我把它放在一個子目錄wx/string.pxd
- 確保你還可以創建一個wx/__init__.pdx
,如果你選擇做相同)。然後cimport
它並調用適當的功能:
cimport wx.string
wx_string = wx.string.from_python(python_string)
python_string = wx.string.to_python_unicode(wx_string)
感謝您的答案。它讓我走上正確的軌道,讓這個工作。我已經發布我的代碼作爲一個單獨的答案。 – Blair 2011-06-19 04:06:30