我正在使用以下功能(我无法更改签名)
cdef extern from "external.h":
int EP_ProtectedStringByID(int ID, char * Buffer, int Len)
这个函数给了我一个 Widestring 但格式化为字符序列。
buf_size = EP_ProtectedStringByID(2, b'', 0)
buf_string_2 = <char *> malloc((buf_size + 1) * sizeof(char))
if EP_ProtectedStringByID(2, buf_string_2, buf_size) != 0:
for i in range(buf_size):
print(buf_string_2[i], end=" - ")
buf_string_2的类型是bytes
buf_string_2 的内容是:(你可以看到它是宽字符串)
67 - 0 - 39 - 0 - 101 - 0 - 115 - 0 - 116 - 0 - 32 - 0 - 117 - 0 - 110 - 0 - 32 - 0 - 116 - 0 - 101 - 0 - 120 - 0 - 116 - 0 - 101 - 0 - 32 - 0 - 97 - 0 - 118 - 0 - 101 - 0 - 99 - 0 - 32 - 0 - 100 - 0 - 101 - 0 - 115 - 0 - 32 - 0 - 99 - 0 - 97 - 0 - 114 - 0 - 97 - 0 - 99 - 0 - 116 - 0 - -24 - 0 - 114 - 0 - 101 - 0 - 115 - 0 - 32 - 0 - 61 - -40 - -121 - -36 - 60 - -40 - -5 - -33 - 13 - 32 - 66 - 38 - 15 - -2 - 32 - 0 - -23 - 0 - 116 - 0 - 114 - 0 - -30 - 0 - 110 - 0 - 103 - 0 - 101 - 0 - 115 - 0 - 32 - 0 - 33 - 0 - 33 - 0 - 33 - 0 -
对应的顺序一定是
“C'est un texte avec des caractères 💇🏻u200d♂️ étrânges !!!”
我想检索这个宽字符串并在 python 中显示它
实际上我这样做没有成功,因为转换在“第二个字符”之后停止
cdef extern from "cstdlib":
size_t mbstowcs(wchar_t * dest, const char * src, size_t max)
if EP_ProtectedStringByID(2, buf_string_2, buf_size) != 0:
buf_string = <wchar_t *> malloc((buf_size // sizeof(wchar_t) + 1) * sizeof(wchar_t))
mbstowcs(buf_string,buf_string_2,buf_size)
pystr_2 = PyUnicode_FromWideChar(buf_string, -1)
wide_string = str(<object> pystr_2)
print('WideString :', wide_string)
感谢您的帮助
cdef extern from "external.h":
int External_Function(int ID, char * Buffer, int Len)
此函数可以根据上下文使用 wchar_t 或 char 填充缓冲区。
如果函数,用wchar_t填充内存提示是将指针char*转换为wchar_t*
cdef char * buf_string_2
cdef wchar_t * buf_string
cdef PyObject * pystr_2
buf_string_2 = <char *> malloc((buf_size + 2) * sizeof(char))
if External_Function(2, buf_string_2, buf_size) != 0:
buf_string_2[buf_size] = b'\0'
buf_string_2[buf_size+1] = b'\0'
p_caster = buf_string_2
buf_string = <wchar_t*><void*>buf_string_2
pystr_2 = PyUnicode_FromWideChar(buf_string, -1)
wide_string = str(<object> pystr_2)
print('WideString :', wide_string)
else:
print("Error can't extract string 2")
谢谢大家,