Python3 带有 pyobjc 的 unicode 字符串

Python3 unicode strings with pyobjc

我正在将许多使用 pyobjc 的 python2 脚本转换为 python3,但无法让它们正常工作。该问题似乎与 python3.

中的 Unicode 更改有关

以下对 pyobjc 方法的调用适用于 python2:

import Quartz as Quartz
filename = '/path/to/myfile.pdf'
provider = Quartz.CGDataProviderCreateWithFilename(filename)

但在 python 3 中,我得到 ValueError: depythonifying 'char', got 'str' of 1

这可以通过先对字符串进行编码来解决:

filenameNonU = filename.encode('utf-8')
provider = Quartz.CGDataProviderCreateWithFilename(filenameNonU)

... 并且脚本有效,除非 字符串包含 'non-ASCII' 个字符(例如 Ä∂∫ß ),在这种情况下,我得到:ValueError: depythonifying 'char', got 'int' of wrong magnitude

使用编解码器 'raw-unicode-escape' 适用于 ASCII 范围;并且 not 标记带有 Unicode 字符的字符串的错误,但只是 returns None 来自该方法,所以这似乎只是一个获得正确的问题编解码器。

所以,我的问题是:我需要做什么才能使我的字符串与 python2 使用的格式相同,以便 pyobjc 方法能够正确处理它们?

python2 returns 类似于:

A\xcc\x88\xc6\x92\xe2\x88\x82

对于大于 128 的 Unicode 字符;当编码为 utf-8 时,我在 python3 中得到相同的结果,除了 b 前缀。

raw_unicode_escape 给出类似于 A\u0308\u0192\u2202 的内容,这是一种不同的格式。

有这个问题的方法在 ObjC 中使用指针作为它们的参数并非巧合。但是 python 的好处之一是它(到目前为止)可以不可见地处理类型和指针之类的事情。

我已经与 pyObjC 的维护者 Ronald Oussoren 取得了联系,他确认存在导致 255 以上字符出现问题的错误。

这已在 pyobjc 8.5 中修复。

为避免疑义,作为参数传递的字符串的正确编码应为 utf8