You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从C程序向Python脚本返回值时遇Unicode解码错误求助

解决C返回JSON到Python的Unicode解码错误

问题根源分析

  1. 函数返回类型设置错误:你的Python代码中错误地给EthereumProcessor设置了restype,但实际调用的是getJson函数,导致ctypes无法正确解析返回的指针,可能读取到无效内存数据。
  2. C代码返回栈内存:如果C函数返回栈上分配的字符串(如char buf[1024]; return buf;),函数执行完后栈内存会被释放,返回的指针指向垃圾数据,其中包含无法被UTF-8解码的乱码字节。
  3. 编码不匹配:C代码生成的字符串编码不是UTF-8(比如GBK),用UTF-8解码自然会失败。

具体解决方案

1. 修正Python的返回类型设置

将错误的restype设置改为对应getJson函数:

import ctypes

my_functions = ctypes.cdll.LoadLibrary("./my_functions.so")

# 为getJson设置正确的返回类型
my_functions.getJson.restype = ctypes.c_char_p
# 若getJson无参数,修正argtypes(原代码设置了(c_char_p,)但调用时未传参,需匹配)
my_functions.getJson.argtypes = ()

result = my_functions.getJson()

# 先打印原始字节,确认数据是否有效
print("\RESULT (raw bytes):", result)

2. 修正C代码的字符串返回方式

必须使用堆内存分配字符串,避免返回栈内存。示例C代码:

#include <stdlib.h>
#include <string.h>

char* getJson() {
    // 确保JSON字符串为UTF-8编码
    const char* json_content = "{\"data\":\"0x123132\"}";
    // 分配足够堆内存并复制字符串
    char* return_str = malloc(strlen(json_content) + 1);
    if (return_str != NULL) {
        strcpy(return_str, json_content);
    }
    return return_str;
}

3. 处理编码问题

如果确认C代码输出的是其他编码(如GBK),可指定对应编码解码并添加错误处理:

# 替换为实际编码,同时处理无效字节避免崩溃
print("\RESULT:", str(result, "gbk", errors="replace"))

优先推荐:修改C代码确保输出UTF-8编码的字符串,从根源避免编码兼容问题。

4. 释放堆内存(避免内存泄漏)

C代码用malloc分配的内存,Python需手动调用free释放:

# 加载系统libc库(Linux环境)
libc = ctypes.CDLL("libc.so.6")
# 释放C返回的内存
libc.free(result)

内容的提问来源于stack exchange,提问作者Aeroxer Support

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 19:45:32