-1

PythonモジュールでのUTF-8/16に関するさまざまなアプローチに悩まされています。Python Cモジュールを作成するのは初めての試みでしたが、Unicodeオブジェクトからすべてのバイトを取得してC関数でこれらを処理する方法を知りたいと思います。私が見るように、これらはC文字配列の単純なASCII文字列として表されるかもしれませんか?

static PyObject* unicode_worker(PyObject* self, PyObject* args)
{
Py_UNICODE  *src;
int srclen;
register Py_UNICODE ch;
wchar_t widecharBuffer[4096];

if (! PyArg_ParseTuple(args, "u#", &src, &srclen))
    return NULL;

ch = *src;

PyUnicode_AsWideChar((PyUnicodeObject *)src, widecharBuffer, srclen-1);

Py_RETURN_NONE;
}

gdbを次のように使用すると、次のようになります。

gdb python
run sh.py

エラーが表示されます:

Program received signal SIGSEGV, Segmentation fault.
0x00000036010b05c8 in PyUnicodeUCS4_AsWideChar () from /usr/lib64/libpython2.7.so.1.0

PyUnicode_AsWideChar呼び出しで何が改善される可能性があり、現在何が問題になっていますか?

UPD:Mats Petersson、問題はより明確になりました。

4

1 に答える 1

1

最後に、私は1つの重要なことに注意を払っていなかったことがわかりました。Py_UNICODEには必要なすべてのテキストデータが含まれており、それだけです。このタイプのバイト単位のサイズは異なる場合があるため、オペレーティングシステムによってチェックする必要があります。とにかく、Linuxビルドではwchar_tとPy_UNICODEに違いはないので、次に直面した問題はロケールの設定だけでした。それは単純にソルバーでした:

if (! setlocale(LC_ALL, "ru_RU.utf8")) return PyErr_SetFromErrno(SetLocaleError);
wprintf(L"%ls\n", src);

これで、Pythonモジュールの実験を続けることができます。この問題は、解決されたようです。

于 2012-12-25T01:09:23.397 に答える