c++ 将char* 转换为wchar_t*

v6ylcynt  于 2023-04-01  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在使用以下函数(我无法更改签名)

cdef extern from "external.h":
    int EP_ProtectedStringByID(int ID, char * Buffer, int Len)

这个函数给了我一个宽字符串,但格式为字符串序列。

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电话:+86 -10 - 88888888传真:+86 -10 - 88888888114 - 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 -电话:+86 -030 - 88888888传真:+86 -030 - 88888888
相应的序列必须是
“这💇🏻‍是一个有着雄性特征的文本️!!!”
我想检索这个宽字符串并在python中显示它
实际上,我这样做没有成功的原因转换停止后,“第二个字符”这是**\0**

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)

谢谢你的帮忙

zf9nrax1

zf9nrax11#

  • 总而言之,我使用一个外部库,它具有以下签名:
cdef extern from "external.h":
    int External_Function(int ID, char * Buffer, int Len)
  • 此函数可以根据上下文使用wchar_tchar填充缓冲区。
  • 如果函数用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")

谢谢大家,

相关问题