我有一个 CFString 并且想在 Python 中使用它。
最快的方法是什么?是否可以避免转换,即仅从 CFString 指针以某种方式创建 Python 字符串?
我有一个 CFString 并且想在 Python 中使用它。
最快的方法是什么?是否可以避免转换,即仅从 CFString 指针以某种方式创建 Python 字符串?
是否可以避免转换,即仅从 CFString 指针以某种方式创建 Python 字符串?
从来没听说过。Python 是跨平台的,即使 CFStrings 可用,它也没有任何理由在内部使用它们。
您可能能够获得字符串的支持C string、MacRoman Pascal string或UTF-16 character buffer,但其中每一个都允许失败,因此您不能依赖它们中的任何一个工作。您必须始终将字符复制到您自己的缓冲区作为最后一次尝试。
您可能甚至不应该尝试 Pascal-string 路由,因为您仍然需要从 MacRoman 转换为 UTF-8。此时您不妨只使用字符串自己的转换 API。
[转换]最快的方法是什么?
如果上述任何快捷方式(除了 Pascal 字符串)成功,这将是最快的方式。
一种或另一种方式,您需要获取一个包含某种形式的字符的缓冲区,然后从该缓冲区创建一个 Python 字符串。
此时值得一提的是,在 Python 2.x 中,str
类型是纯 8 位数据对象。出于这个原因,Python 3 将其重命名为bytes
,您应该将其视为 NS/CFData 的 Python 对应物,而不是 NS/CFString。
NS/CFStrings 包含 Unicode 字符,因此您需要Python 的unicode
(str
在 Python 3 中)类型。
注意CFStringGetLength
:它以 UTF-16 代码单元返回长度。如果您最终使用 UTF-8,则 UTF-8 代码单元的长度可能会有所不同。
从该 Python 文档中,您可以根据从 CFString 中获得的内容来创建 Python 字符串:
PyUnicode_FromString
函数采用 UTF-8 编码的 C 字符串。PyUnicode_FromStringAndSize
函数采用 UTF-8 编码字符的缓冲区,以及该缓冲区的大小。这可能比FromString
.PyUnicode_FromUnicode
函数采用 UTF-16 编码字符的缓冲区,以及该缓冲区的大小。仅使用 Python 的unicode
(PyUnicode) 类;不是str
/// 。bytes
_ PyString
_PyBytes
我会GetCStringPtr
先尝试(请求 UTF-8)。如果成功,我会调用CFStringGetMaximumSizeForEncoding
来确定(希望比 更快strlen
)该字符串的长度,然后调用PyUnicode_FromStringAndSize
来创建 Python 字符串。
接下来,我会询问 CFString将其转换为.
CFStringGetLength
, CFStringGetCharactersPtr
, CFStringGetCharacters
(如果GetCharactersPtr
失败)和PyUnicode_FromUnicode
.CFStringGetBytes
函数一次来确定转换为 UTF-8 所需的缓冲区大小,然后再次执行该转换,然后PyUnicode_FromStringAndSize
.(我应该指出,“if”可能是过早的优化。CFStringGetBytes
是 CFString 的中心文本编码转换函数;它能够返回任何编码,包括 UTF-16。您可能想要同时编写条件CFStringGetCharacters{Ptr,}
解决方案和无条件解决方案CFStringGetBytes
解决方案并将它们相互计时,并查看对于您当前正在处理的字符串,最快的编码是否实际上是 UTF-16。)
为什么要在 python 中使用 CFString。顺便说一句,CF 字符串定义了自己的结构,并且它存储在内存中的方式与 python 字符串不同。它不可能进行这种转换。