从C程序向Python脚本返回值时遇Unicode解码错误求助
解决C返回JSON到Python的Unicode解码错误
问题根源分析
- 函数返回类型设置错误:你的Python代码中错误地给
EthereumProcessor设置了restype,但实际调用的是getJson函数,导致ctypes无法正确解析返回的指针,可能读取到无效内存数据。 - C代码返回栈内存:如果C函数返回栈上分配的字符串(如
char buf[1024]; return buf;),函数执行完后栈内存会被释放,返回的指针指向垃圾数据,其中包含无法被UTF-8解码的乱码字节。 - 编码不匹配: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
相关产品推荐
相关产品推荐

