Cython を使用して C ライブラリを Pyhon 3 にラップしています。wchar_t 文字列を関数から返したい python オブジェクトに変換する方法を探しています。この質問には答えがありますが、文字列をマルチバイト str としてエンコードし、それをデコードして Unicode に戻す必要があります。もっと簡単な解決策を望みます。Python C API からPyUnicode_FromWideCharを使用しようとしましたが、segfault が発生しています。ここに私の .pyx コードがあります:
from cpython.ref cimport PyObject
from libc.stddef cimport wchar_t
cdef extern from "Python.h":
PyObject* PyUnicode_FromWideChar(wchar_t *w, Py_ssize_t size)
cdef extern from "../../src/my_c_lib.h":
wchar_t * myObjToStr(wchar_t * result, size_t size, myObj * obj)
cdef class MyClass:
cdef myObj * ptr
...
def to_str(self):
cdef wchar_t buf[64]
cdef wchar_t * result = myObjToStr(buf, 64, self.ptr)
if result is NULL:
raise Exception("Error converting object to string.")
cdef PyObject * pystr = PyUnicode_FromWideChar(result, 64)
return <object>pystr
result
は実際には へのポインタbuf
です。これの何が問題なのですか?エンコード/デコードせずに別の方法はありますか?
編集:NULLを返すことがわかりましたPyUnicode_FromWideChar()
が、なぜですか? 確認しましたが、これresult
は有効な wchar_t * 文字列です。