You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 06:45:31