str
以后都在 github 更新,请戳 cpython str/unicode 底层实现解析
目录
相关位置文件
- cpython/Objects/unicodeobject.c
- cpython/Include/unicodeobject.h
- cpython/Include/cpython/unicodeobject.h
内存构造
如果你对 c 语言的 bit-fields 有疑问,请参考 When to use bit-fields in C? 和 “:” (colon) in C struct - what does it mean?
字符串转换
在我们深入的看 unicod 对象如何创建,调整空间之前,我们先来看下 PyUnicode_AsUTF8 这个 c 函数
/*
每当我需要在 cpython 里面尝试把 一个 PyObject 转换成 const char* 指针时,我会调用这个函数
const char *s = PyUnicode_AsUTF8(py_object_to_be_converted)
我们来看看这个函数的定义
*/
const char *
PyUnicode_AsUTF8(PyObject *unicode)
{
return PyUnicode_AsUTF8AndSize(unicode, NULL);
}
/* 找到 PyUnicode_AsUTF8AndSize 这个函数 */
const char *
PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *psize)
{
PyObject *bytes;
/* 开始之前会做一些边界检查,先忽略这部分检查 */
/* PyUnicode_UTF8 检查 unicode 对象的 compact flag, 并根据这个 flag 返回一个指向 char 的指针,看下图 */
if (PyUnicode_UTF8(unicode) == NULL) {
assert(!PyUnicode_IS_COMPACT_ASCII(unicode));
/* bytes 的类型是 PyBytesObject,bytes 一共可以有4种不同的可能,详见下图 */
bytes = _PyUnicode_AsUTF8String(unicode, NULL);
if (bytes == NULL)
return NULL;
/* 把