2

宣言のdefineをchar *使用して、基本型が、のPythonC拡張機能でオブジェクトのメンバーを作成するのは簡単です。T_STRINGPyMemberDef

に相当するものがないように見えるのはなぜwchar_t *ですか?そして、実際に1つあるとしたら、それは何ですか?

例えば

struct object含むchar *text

PyMemberDefアレイには{"text", T_STRING, offsetof(struct object, text), READONLY, "This is a normal character string."}

対のようなもの

struct object含むwchar_t *wtext

PyMemberDefアレイには{"wtext", T_WSTRING, offsetof(struct object, wtext), READONLY, "This is a wide character string"}

のようなものPyUnicode_AsString()とそれに関連するメソッドを使用して、UTF-8でデータをエンコードし、基本的なchar文字列に格納し、後でデコードできることを理解していますが、そのようにするには、ジェネリックgetattrsetattrメソッド/関数を次のようなものでラップする必要があります。エンコードされたテキストを考慮します。構造体内に固定要素サイズの文字配列が必要で、構造体に格納できる有効な文字数を変更したくない場合は、あまり役に立ちません。

4

1 に答える 1

2

wchar_t直接使用することは移植できません。代わりに、PythonはPy_UNICODEタイプをUnicode文字のストレージユニットとして定義します。

プラットフォームに応じて、使用可能な場合、またはunsigned short / integer / longPy_UNICODEとして定義wchar_tできます。その幅は、Pythonの構成方法(UCS2とUCS4)、および使用するアーキテクチャーとCコンパイラーによって異なります。関連する定義はで見つけることができますunicodeobject.h

ユースケースでは、オブジェクトは次を使用してUnicode文字列である属性を持つことができますT_OBJECT

static struct PyMemberDef attr_members[] = {
  { "wtext", T_OBJECT, offsetof(PyAttrObject, wtext), READONLY, "wide string"}
  ...

オブジェクトの初期化子で型チェックを実行できます。

...
if (!PyUnicode_CheckExact(arg)) {
    PyErr_Format(PyExc_ValueError, "arg must be a unicode string");
    return NULL;
}
Py_INCREF(arg);
self->wtext = arg;
...

Py_UNICODE *Unicode文字列の低レベルの文字を反復処理する必要がある場合は、 :を返すマクロがあります。

int i = 0;
Py_ssize_t size = PyUnicode_GetSize(self->wtext);
Py_UNICODE *chars = PyUnicode_AS_UNICODE(self->wtext);
for (i = 0; i < size; i++) {
    // use chars[i]
    ...
于 2011-06-01T03:01:51.613 に答える