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结尾数æ�®æ�¥åˆ›å»ºå—符串。