1
모든 문자열 유형에 LPCWSTR
을 사용하는 라이브러리에 대한 CGO 바인딩을 작성하고 있습니다. C.LPCWSTR
에서 string
으로 변환하려면 어떻게해야합니까?CGO : LPCWSTR과 문자열 간의 변환
모든 문자열 유형에 LPCWSTR
을 사용하는 라이브러리에 대한 CGO 바인딩을 작성하고 있습니다. C.LPCWSTR
에서 string
으로 변환하려면 어떻게해야합니까?CGO : LPCWSTR과 문자열 간의 변환
당신은,
// 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)
당신은 일반적으로 C 코드로 이동 포인터를 통과 할 수하지 않을 LPCWSTR
[]uint16
로 "캐스트"할 수 있어야하고, 문자
utf16
패키지를 사용한다
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)
}
이 수도 ALS : LPCWSTR에 문자열 변환 할 때 그래서, 당신은 해결책처럼 보일 수있는 이동 문자열 s
에서 변환 C에서 메모리를 ALLOC 할 것 o C에서 간단한 래퍼 함수로 활용할 수있는 cstring으로 변환하는 데 도움이되는 MFC 매크로가 될 수 있습니다. 이렇게하면 내장 된 C.CString
및 C.GoString
함수를 사용하여 데이터를 쉽게 복사 할 수 있습니다.
이 모양이 맞습니까? https://gist.github.com/icholy/f8a07551c5aa3b97521767b1a3223275 –
@iliacholy : 더 많은 정보를 추가했습니다. 아마도 포인터를 C 코드로 전달하는 것이 항상 안전하지 않을 수도 있기 때문에 C로 메모리를 할당하려고합니다. – JimB
감사합니다. 고마워요! –