将 char* 转换为 wchar_t*

问题描述 投票:0回答:1

我正在使用以下功能(我无法更改签名)

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)

感谢您的帮助

python c++ cython
1个回答
0
投票
  • 总而言之,我使用具有此签名的外部库:
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")

谢谢大家,

© www.soinside.com 2019 - 2024. All rights reserved.