go 调用winapi_golang 调用windows API 中文的处理

本文介绍了在Go语言中调用Windows API获取进程信息时遇到的中文乱码问题及其解决方案。通过引入"github.com/axgle/mahonia"库,使用GBK转UTF-8进行解码,从而正确显示中文进程名。
摘要由CSDN通过智能技术生成

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这个库来尝试,没成功.

在这里做个分享,呵呵

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值