1

我有一个 CFString 并且想在 Python 中使用它。

最快的方法是什么?是否可以避免转换,即仅从 CFString 指针以某种方式创建 Python 字符串?

4

2 回答 2

1

是否可以避免转换,即仅从 CFString 指针以某种方式创建 Python 字符串?

从来没听说过。Python 是跨平台的,即使 CFStrings 可用,它也没有任何理由在内部使用它们。

可能能够获得字符串的支持C stringMacRoman Pascal stringUTF-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 的unicodestr在 Python 3 中)类型

注意CFStringGetLength:它以 UTF-16 代码单元返回长度。如果您最终使用 UTF-8,则 UTF-8 代码单元的长度可能会有所不同。

从该 Python 文档中,您可以根据从 CFString 中获得的内容来创建 Python 字符串:

TL;博士

仅使用 Python 的unicode(PyUnicode) 类;不是str/// 。bytes_ PyString_PyBytes

我会GetCStringPtr先尝试(请求 UTF-8)。如果成功,我会调用CFStringGetMaximumSizeForEncoding来确定(希望比 更快strlen)该字符串的长度,然后调用PyUnicode_FromStringAndSize来创建 Python 字符串。

接下来,我会询问 CFString将其转换为.

  • 如果最快的编码是 UTF-16(或者,CFString 称之为“Unicode”),我会使用CFStringGetLength, CFStringGetCharactersPtr, CFStringGetCharacters(如果GetCharactersPtr失败)和PyUnicode_FromUnicode.
  • 否则,我将使用CFStringGetBytes函数一次来确定转换为 UTF-8 所需的缓冲区大小,然后再次执行该转换,然后PyUnicode_FromStringAndSize.

(我应该指出,“if”可能是过早的优化。CFStringGetBytes是 CFString 的中心文本编码转换函数;它能够返回任何编码,包括 UTF-16。您可能想要同时编写条件CFStringGetCharacters{Ptr,}解决方案和无条件解决方案CFStringGetBytes解决方案并将它们相互计时,并查看对于您当前正在处理的字符串,最快的编码是否实际上是 UTF-16。)

于 2012-05-05T02:12:23.327 回答
-2

为什么要在 python 中使用 CFString。顺便说一句,CF 字符串定义了自己的结构,并且它存储在内存中的方式与 python 字符串不同。它不可能进行这种转换。

于 2012-05-03T11:45:52.707 回答