Golang中如何将*uint16转换为string?含C函数返回场景
在Go中将*uint16转换为string的方法
针对C函数返回的*uint16(通常是UTF-16编码、以空字符0结尾的字符串),有以下几种可行的转换方法:
方法1:使用syscall包的内置函数
syscall.UTF16ToString是最直接的工具,专门用于将UTF-16编码的*uint16转换为Go的string,会自动识别终止的空字符:
import "syscall" func ptrToString(ptr *uint16) string { return syscall.UTF16ToString(ptr) }
方法2:手动遍历转换(不依赖syscall)
如果不想引入syscall包,可以结合unicode/utf16和unsafe包手动处理:
import ( "unicode/utf16" "unsafe" ) func ptrToString(ptr *uint16) string { var utf16Chars []uint16 // 遍历指针指向的内存,直到遇到终止的0值 for p := ptr; *p != 0; p = (*uint16)(unsafe.Pointer(uintptr(unsafe.Pointer(p)) + 2)) { utf16Chars = append(utf16Chars, *p) } // 将UTF-16编码的切片解码为rune,再转成string return string(utf16.Decode(utf16Chars)) }
方法3:已知长度时的转换
如果提前知道字符串的实际长度(无需依赖终止空字符),可以用unsafe.Slice直接生成切片再解码:
import ( "unicode/utf16" "unsafe" ) func ptrToStringWithLength(ptr *uint16, length int) string { // 直接将指针和长度转为uint16切片 utf16Chars := unsafe.Slice(ptr, length) return string(utf16.Decode(utf16Chars)) }
注意事项
- 确保C返回的
*uint16是UTF-16编码格式,这是Windows API等C接口返回宽字符串的标准形式。 - 如果字符串没有以
0结尾,手动遍历的方法会出现内存越界,此时必须使用已知长度的转换方式。
内容的提问来源于stack exchange,提问作者TienThanh
相关产品推荐
相关产品推荐

