15.15 C字符串转�为Python字符串¶

问题¶

怎样将C中的字符串转�为Python字节或一个字符串对象?

解决方案¶

C字符串使用一对 char * 和 int �表示, 你需�决定字符串到底是用一个原始字节字符串还是一个Unicode字符串�表示。 字节对象�以�下�这样使用 Py_BuildValue() �构建:

char *s;     /* Pointer to C string data */
int   len;   /* Length of data */

/* Make a bytes object */
PyObject *obj = Py_BuildValue("y#", s, len);

如果你�创建一个Unicode字符串,并且你知� s 指�了UTF-8编�的数�,�以使用下�的方�:

PyObject *obj = Py_BuildValue("s#", s, len);

如果 s 使用其他编�方�,那么�以�下�使用 PyUnicode_Decode() �构建一个字符串:

PyObject *obj = PyUnicode_Decode(s, len, "encoding", "errors");

/* Examples /*
obj = PyUnicode_Decode(s, len, "latin-1", "strict");
obj = PyUnicode_Decode(s, len, "ascii", "ignore");

如果你�好有一个用 wchar_t *, len 对表示的宽字符串, 有几�选择性。首先你�以使用 Py_BuildValue() :

wchar_t *w;    /* Wide character string */
int len;       /* Length */

PyObject *obj = Py_BuildValue("u#", w, len);

�外,你还�以使用 PyUnicode_FromWideChar() :

PyObject *obj = PyUnicode_FromWideChar(w, len);

对于宽字符串,并没有对字符数�进行解�——它被�定是原始Unicode编�指针,�以被直接转��Python。

讨论¶

将C中的字符串转�为Python字符串�循和I/O�样的原则。 也就是说,�自C中的数�必须根�一些解�器被显�的解�为一个字符串。 通常编�格�包括ASCII�Latin-1和UTF-8. 如果你并�确定编�方�或者数�是二进制的,你最好将字符串编��字节。 当构造一个对象的时候,Python通常会�制你�供的字符串数�。 如果有必�的�,你需�在��去释放C字符串。 �时,为了让程�更加�壮,你应该�时使用一个指针和一个大�值, 而�是�赖NULL结尾数��创建字符串。