2

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 * 文字列です。

4

1 に答える 1

3

PyUnicode_FromWideChar(result, -1)(関数が内部で wcslen を使用するように) の2 番目の引数として -1 を使用すると、問題が修正されました。

したがって、 PyUnicode_FromWideChar実際に進むべき道です。

于 2013-05-13T16:22:49.693 に答える