从 c++ 中用 cppyy 读取 char16_t* 字符串

Posted

技术标签:

【中文标题】从 c++ 中用 cppyy 读取 char16_t* 字符串【英文标题】:Read char16_t* String with cppyy from c++ 【发布时间】:2020-05-04 14:06:07 【问题描述】:

cppyy 是我发现的唯一一个 Python 包,用于在 Linux 下使用 char16_t* 字符串包装 C++ 库。给定一个函数:

int ::func1(const char16_t* symbol, char16_t* data, const unsigned int length)
// [in] symbol, [out] data, [in] length
// Returns a string "data" of "length" dependent on keyword "symbol"

如何从函数中读取字符串“data”? ctypes-Approach 不起作用:

length = 10
val = ctypes.create_unicode_buffer(length)
cppyy.gbl.func1('Keyname', val, length)

通过文档工作并设法将所有内容都包含在此之外。非常感谢提示。

【问题讨论】:

【参考方案1】:

恐怕 cppyy 总是试图将char16_t* 解释为 Python unicode 字符串(包括 BOM 和 Python 的特定编码)而不是将其视为低级数组或外参数.我可能可以修复/改进其中的一些问题,但现在,这里有一个解决方法可以让你超越这一点:

import cppyy
import cppyy.ll

cppyy.cppdef("""
int func1_wrap(const char16_t* symbol, void* data, const unsigned int length) 
    return func1(symbol, (char16_t*)data, length);

""")

def func1_pywrap(symbol, length):
    buf = cppyy.ll.array_new[cppyy.gbl.uint16_t](length)
    res = cppyy.gbl.func1_wrap(symbol, buf, length)
    return res, cppyy.ll.cast['char16_t*'](buf)

cppyy.gbl.func1 = func1_pywrap

result = cppyy.gbl.func1('Keyname', 5)
print(result)

各种强制转换只是为了让 cppyy 对它正在处理一个 unicode 字符串的事实视而不见,只是让它传递指针。

【讨论】:

别忘了删除数组:cppyy.ll.array_delete(buf) else: MemoryLeak `

以上是关于从 c++ 中用 cppyy 读取 char16_t* 字符串的主要内容,如果未能解决你的问题,请参考以下文章

通过 C++ pythonization 回调将 operator() 的 cppyy 自动映射恢复到 __getitem__

cppyy - 如何调用接受集合的 c++ 函数?

C++ 文件 IO:读取和写入 16 位字

带有 char16_t 或 char32_t 的 Visual Studio C++ 2015 std::codecvt

使用用于 C++ 代码的标头编译 C 代码时未知类型名称 char16_t

使用cppyy时如何在python中创建子类?