golang 调用windows API 中文的处理
程序员文章站
2022-10-16 13:07:20
Go语言发展势头很猛,其实缺点也很多,好在有广大爱好者提供了无数的库,把优点表现得太好了,搞得什么都是拿来就使用,基本完全不理会指针,性能还不错。 最近在windows下使用遇到一个中文的问题,首先要了解的是Golang的编码是utf-8的,而中文windows的API返回时多字节的GBK编码。 下 ......
go语言发展势头很猛,其实缺点也很多,好在有广大爱好者提供了无数的库,把优点表现得太好了,搞得什么都是拿来就使用,基本完全不理会指针,性能还不错。
最近在windows下使用遇到一个中文的问题,首先要了解的是golang的编码是utf-8的,而中文windows的api返回时多字节的gbk编码。
下面是利用api 获得进程的示例,代码是网上的,但是使用时出现了,当进程名是中文时出现的乱码问题。
先贴代码。
package utilities
import (
"bytes"
"io"
"log"
"net/http"
"sort"
"strconv"
"strings"
"syscall"
// "unicode/utf8"
"unsafe"
"github.com/axgle/mahonia"
)
type ulong int32
type ulong_ptr uintptr
type processentry32 struct {
dwsize ulong
cntusage ulong
th32processid ulong
th32defaultheapid ulong_ptr
th32moduleid ulong
cntthreads ulong
th32parentprocessid ulong
pcpriclassbase ulong
dwflags ulong
szexefile [260]byte
}
type processstruct struct {
processname string // 进程名称
processid int // 进程id
}
type processstructslice []processstruct
func (a processstructslice) len() int { // 重写 len() 方法
return len(a)
}
func (a processstructslice) swap(i, j int) { // 重写 swap() 方法
a[i], a[j] = a[j], a[i]
}
func (a processstructslice) less(i, j int) bool { // 重写 less() 方法, 从大到小排序
if strings.compare(a[j].processname, a[i].processname) < 0 {
return true
} else {
return false
}
}
func upayin_process(w http.responsewriter, r *http.request) {
r.parseform()
_, err := r.form["callsys"]
if !err {
io.writestring(w, "err")
return
}
kernel32 := syscall.newlazydll("kernel32.dll")
createtoolhelp32snapshot := kernel32.newproc("createtoolhelp32snapshot")
phandle, _, _ := createtoolhelp32snapshot.call(uintptr(0x2), uintptr(0x0))
if int(phandle) == -1 {
io.writestring(w, "get process err")
return
}
var data []processstruct
var buffer bytes.buffer
decoder := mahonia.newdecoder("gbk")
process32next := kernel32.newproc("process32next")
for {
var proc processentry32
proc.dwsize = ulong(unsafe.sizeof(proc))
if rt, _, _ := process32next.call(uintptr(phandle), uintptr(unsafe.pointer(&proc))); int(rt) == 1 {
len_szexefile := 0
for _, b := range proc.szexefile {
if b == 0 {
break
}
len_szexefile++
}
var bytetest []byte = []byte(proc.szexefile[:len_szexefile])
_, newdata, newerr := decoder.translate(bytetest, true)
if newerr != nil {
log.println(newerr)
}
data = append(data, processstruct{
processname: string(newdata),
processid: int(proc.th32processid),
})
} else {
break
}
}
closehandle := kernel32.newproc("closehandle")
_, _, _ = closehandle.call(phandle)
sort.sort(processstructslice(data))
for _, v := range data {
log.println(v.processname)
buffer.writestring("processname : ")
buffer.writestring(v.processname)
buffer.writestring(" processid : ")
buffer.writestring(strconv.itoa(v.processid))
buffer.writestring("\n")
}
io.writestring(w, buffer.string())
}
重要的是
"github.com/axgle/mahonia" //这个库
decoder := mahonia.newdecoder("gbk")
//gbk转utf8
var bytetest []byte = []byte(proc.szexefile[:len_szexefile]) _, newdata, newerr := decoder.translate(bytetest, true)
其实里面做了判断,并不是单纯的使用utf8.encoderune来解决,刚开始我也是直接使用utf8这个库来尝试,没成功.
在这里做个分享,呵呵
推荐阅读