Python中如何通过ctypes向C API函数传递中文字符串?

from ctypes import CDLL

c = CDLL("msvcrt.dll")

c.printf('a=%d'.encode(),1) #这样正确

c.printf('中国=%d'.encode(),1) # 这里不能正确显示 @: a 浜?1

#----------又如------------

int testFile(const char* filename); /* 打开文件进行一些操作(文件名可能含有中文字符) */

path = r"c:\中文测试.txt" #python 中

API.testFile(path.encode()) # 会出现打开文件出错提示


Python中如何通过ctypes向C API函数传递中文字符串?

6 回复

我复制了你的代码在本机测试,中文没有问题
https://www.jianguoyun.com/p/DZCa_n4Qhp-3BhiJrzM

win10
git-bash.exe
python3.4.3


在Python中通过ctypes向C API函数传递中文字符串,核心是确保字符串以正确的编码(通常是UTF-8)转换为C兼容的字节形式。关键步骤如下:

  1. 编码字符串:使用.encode('utf-8')将Python字符串(Unicode)转换为UTF-8编码的bytes对象。
  2. 创建c_char_p:通过ctypes.c_char_p()将字节对象包装成C风格的字符串指针。
  3. 函数声明:在定义C函数原型时,参数类型应指定为ctypes.c_char_p

完整示例: 假设C函数原型为:void print_string(const char* str);

import ctypes

# 加载C库
lib = ctypes.CDLL('./your_c_library.so')  # Linux/Mac
# lib = ctypes.CDLL('your_c_library.dll')  # Windows

# 定义函数原型
lib.print_string.argtypes = [ctypes.c_char_p]
lib.print_string.restype = None

# 中文字符串处理
chinese_str = "你好,世界"
encoded_str = chinese_str.encode('utf-8')  # 编码为UTF-8字节串
c_str = ctypes.c_char_p(encoded_str)       # 转换为C字符串指针

# 调用C函数
lib.print_string(c_str)

注意事项

  • 如果C函数需要修改字符串,需使用create_string_buffer()创建可写缓冲区。
  • 确保C代码使用UTF-8编码处理字符串(例如C中printf打印UTF-8字符串需终端支持)。

一句话总结:用UTF-8编码字符串后通过c_char_p传递即可。

我这里输出:
涓浗=1

我明白了,因为 python 默认的 str.encode() 是 utf8,而我之所以成功是因为 git-bash  本身就是 utf8 环境
如果你在 windows 的 cmd 中运行这段代码,由于 cmd 默认编码是 gbk,所以你代码这样改之后就应该没问题
python<br>c.printf('老铁看这里 a=%d'.encode('gbk'),1) <br>

我想知道如何传递 path 给 C API.testFile()这个库函数?

呵呵,成功了
path.encode(‘gbk’)

回到顶部