Python C API unicode 参数

标签 python c unicode python-c-api

我有一个简单的 python 脚本

import _tph
str = u'Привет, <b>мир!</b>' # Some unicode string with a russian characters
_tph.strip_tags(str)

和C库,编译成_tph.so。这是一个 strip_tags 函数:

PyObject *strip_tags(PyObject *self, PyObject *args) {
    PyUnicodeObject *string;
    Py_ssize_t length;

    PyArg_ParseTuple(args, "u#", &string, &length);
    printf("%d, %d\n", string->length, length);

    // ...
}

printf 函数打印:1080, 19。所以,str 的长度实际上是 19 个符号,但我从哪里得到了这 1080 个字符?

当我打印string时,我得到了我的str、空字符,然后是很多垃圾字节。

垃圾内存是这样的:

u'\u041f\u0440\u0438\u0432\u0435\u0442, <b>\u043c\u0438\u0440!</b>\x00\x00\u0299\Ub7024000\U08c55800\Ub7025904\x00\Ub777351c\U08c79e58\x00\U08c7a0b4\x00\Ub7025904\Ub7025954\Ub702594c\Ub702591c\Ub702592c\Ub7025934\x00\x00\x00

我怎样才能在这里得到一个普通的字符串?

最佳答案

此处的“字符串”参数命名不当。它是一个指向 Python Unicode 对象的指针,因此您的 printf 会看到大量二进制数据(对象类型、GC header 、引用计数和编码的 unicode 代码点),直到它碰巧找到 printf 解释的零字节作为字符串的结尾。

查看字符串的最简单方法是使用 PyObject_Print(string)。您可以在以下位置找到用于操作 Python unicode 对象的 C 函数:http://docs.python.org/c-api/unicode.html#unicode-objects

关于Python C API unicode 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955250/

相关文章:

python - 在 matplotlib 中绘制二维数组

python - ValueError : Variable rnn/basic_rnn_cell/kernel already exists, 不允许。您的意思是在 VarScope 中设置 reuse=True 或 reuse=tf.AUTO_REUSE 吗?

python - gettext:如何避免 unicode 字符失败?

python - 如何让 SQLAlchemy 正确地将 unicode 省略号插入到 mySQL 表中?

android - 如何在支持/渲染非英语语言的Android项目中做出贡献?

python - 类内的 Nose 测试生成器

c - 当命令访问不存在的文件时来自 popen 的错误状态

c - 汇编语言中 .long function_name 的含义

c - 如何用节点N的总节点生成所有可能的树

c# - 将 Unicode 代理项对转换为文字字符串