func Str2uft16ptr(str string)(p uintptr){//将字符串转为utf16指针
e:=utf16.Encode([]rune(str))//转成unicode
e=append(e, uint16(0))//添加末尾的0
p=uintptr(unsafe.Pointer(&e[0]))//转成指针
//p=uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(str)))
return
}func addbuf(buf []uint16,newcap int)(newbuf []uint16){
newbuf=make([]uint16,newcap)
copy(newbuf,buf)
return
}
func Utf16prt2str(p uintptr)(str string){//将utf16指针转为字符串
len:=0
buf:=make([]uint16,64)
for a:=(*(*uint16)(unsafe.Pointer(p)));a!=0;len++{
if len>=cap(buf){
buf=addbuf(buf,len*2)
}
buf[len]=a
p+=2//uint16占2字节
a=(*(*uint16)(unsafe.Pointer(p)))
}
str=string(utf16.Decode(buf[:len]))
return
}测试代码(Windows下)
func abort(funcname string, err error) {
panic(funcname + " failed: " + err.Error())
}
func msgbox3(text,title string)(res int32){
h, err := syscall.LoadLibrary("user32.dll")
if err != nil {
abort("LoadLibrary", err)
}
defer syscall.FreeLibrary(h)
proc, err := syscall.GetProcAddress(h, "MessageBoxW")
if err != nil {
abort("GetProcAddress", err)
}
r,_,_:=syscall.Syscall6(uintptr(proc), 4, 0, Str2uft16ptr(text), Str2uft16ptr(title),3,0,0)
res=int32(r)
return
}
func main(){
c,t:="你好","提示"
pc,pt:=Str2uft16ptr(c),Str2uft16ptr(t)
c,t=Utf16prt2str(pc),Utf16prt2str(pt)
msgbox3(c,t)
}
本文介绍了一个用Go语言实现的字符串与UTF-16格式互转的实用函数,并通过一个简单的Windows消息框示例展示了这些函数的应用。
1151

被折叠的 条评论
为什么被折叠?



