dpj96988
2016-08-12 21:27
浏览 105
已采纳

CGO:在LPCWSTR和字符串之间转换

I'm writing CGO bindings for a library which uses LPCWSTR for all of its string types. How do I convert from C.LPCWSTR to string and vice-versa?

图片转代码服务由CSDN问答提供 功能建议

我正在为使用 LPCWSTR 为其所有字符串的库编写CGO绑定 类型。 如何将 C.LPCWSTR 转换为 string ,反之亦然?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • doutu1889 2016-08-12 21:44
    已采纳

    You should be able to "cast" the LPCWSTR as a []uint16, and use the utf16 package to decode the characters

    // take a C.wstr pointer, and convert it to a go slice
    // `sz` is the length of the LPCWSTR
    wstr := (*[1 << 30-1]uint16)(unsafe.Pointer(C.wstr))[:sz:sz]
    runes := utf16.Decode(wstr)
    goString := string(runes)
    

    You generally don't want to be passing Go pointers into your C code, so when converting from a string to an LPCWSTR, you will want to alloc the memory in C. A solution for converting from a Go string s might look like:

    func Encode(s string) C.LPCWSTR {
        wstr := utf16.Encode([]rune(s))
    
        p := C.calloc(C.size_t(len(wstr)+1), C.sizeof_uint16_t)
        pp := (*[1 << 30]uint16)(p)
        copy(pp[:], wstr)
    
        return (C.LPCWSTR)(p)
    }
    

    There may also be some MFC macros that could help convert to and from cstrings which you could take advantage of with simple wrapper functions in C. This way you could easily copy the data in and out just using the builtin C.CString and C.GoString functions.

    点赞 打赏 评论

相关推荐 更多相似问题