【发布时间】:2020-10-05 15:42:02
【问题描述】:
我正在研究 PEP 393 之后 Python 如何表示字符串,但我不了解 PyASCIIObject 和 PyCompactUnicodeObject 之间的区别。
我的理解是字符串用以下结构表示:
typedef struct {
PyObject_HEAD
Py_ssize_t length; /* Number of code points in the string */
Py_hash_t hash; /* Hash value; -1 if not set */
struct {
unsigned int interned:2;
unsigned int kind:3;
unsigned int compact:1;
unsigned int ascii:1;
unsigned int ready:1;
unsigned int :24;
} state;
wchar_t *wstr; /* wchar_t representation (null-terminated) */
} PyASCIIObject;
typedef struct {
PyASCIIObject _base;
Py_ssize_t utf8_length;
char *utf8;
Py_ssize_t wstr_length;
} PyCompactUnicodeObject;
typedef struct {
PyCompactUnicodeObject _base;
union {
void *any;
Py_UCS1 *latin1;
Py_UCS2 *ucs2;
Py_UCS4 *ucs4;
} data;
} PyUnicodeObject;
如果我错了,请纠正我,但我的理解是 PyASCIIObject 仅用于具有 ASCII 字符的字符串,PyCompactUnicodeObject 使用 PyASCIIObject 结构,它用于具有至少一个非 ASCII 字符的字符串,而 PyUnicodeObject 用于遗留功能。对吗?
另外,为什么 PyASCIIObject 使用 wchar_t? char 还不足以表示 ASCII 字符串吗? 另外,如果 PyASCIIObject 已经有一个 wchar_t 指针,为什么 PyCompactUnicodeObject 也有一个 char 指针?我的理解是两个指针都指向同一个位置,但是为什么要同时包含两者呢?
【问题讨论】: