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

在这里做个分享,呵呵

go 调用winapi_golang 调用windows API 中文的处理相关推荐

  1. delphi调用windows api

    在Delphi中调用Windows API 函数十分方便,只需在单元的uses段加入Windows 单元名即可(对于由Delphi自动创建的单元,该项工作已经完成).单元Windows.pas 已经由 ...

  2. C#中调用Windows API时的数据类型对应关系

    C#中调用Windows API时的数据类型对应关系 原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE ...

  3. C#调用windows api的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  4. C#中调用Windows API的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  5. 用C#调用Windows API向指定窗口发送按键消息

    为什么80%的码农都做不了架构师?>>>    用C#调用Windows API向指定窗口发送 一.调用Windows API. C#下调用Windows API方法如下: 1.引入 ...

  6. 善于 调用Windows API

    前一段时间看见别人做的一个自动填写信息并且点击登录的程序,觉得很有意思. 其实就是在程序中调用Windows的API,那么如何调用,下面就做个简单的介绍. 写的简单粗暴, 不喜轻喷. 0.首先引入名称 ...

  7. C#中调用Windows API的要点【转载】

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  8. 在C#中调用windows API函数

    Api函数是构筑Windws应用程序的基石,每一种Windows应用程序开发工具,它提供的底层函数都间接或直接地调用了Windows API函数,同时为了实现功能扩展,一般也都提供了调用Windows ...

  9. [收集]Visual C#中调用Windows API

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

最新文章

  1. 厌倦了“正在输入…”的客服对话,是时候pick视频客服了
  2. PowerBI从SCCM数据库中分析数据和KPI展现
  3. 线程(Thread,ThreadPool)、Task、Parallel
  4. pip安装 tensorflow-gpu 提示Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
  5. php语言设计图书管理系统,图书馆管理系统PHP版_7tmu7b
  6. 使用try-with-resources替代try finally释放资源
  7. jeecg-mybatis-framework 参考学习版本
  8. 《深入浅出DPDK》读书笔记(八):网卡性能优化(异步中断模式、轮询模式、混和中断轮询模式)
  9. (项目)生鲜超市(六)
  10. java生成excel中文乱码,JSP应用导出Excel报表的简单实现以及中文乱码彻底解决(HTML)...
  11. Ajax基础之原生js封装
  12. STM32 f103 实现命令终端
  13. Qt处理图片背景为透明色
  14. 初中计算机教案ps,初中信息技术《认识Photoshop CS2的工作界面》教案
  15. LT8618SXB-HDMI发射器,运行功率小于100mA播放24bit 1080P内容,待机功率小于2mA
  16. 技术日记2021/2/12 “牛气飞天”恶作剧
  17. 屏蔽网站、网页和弹窗的方法
  18. MySQL必知必会——实践习题
  19. 牛客java选择题每日打卡Day12
  20. 因IP被列入黑名单导致U-Mail被退信的处理方法

热门文章

  1. 币知识——比特币现金
  2. jQuery通过name获取值
  3. mysql导入导出sql文件
  4. PostgreSQL 打开文件句柄优化 - 百万以上实体对象初始化优化
  5. Blend4精选案例图解教程(三):一键拖拽
  6. Virtura box 构建一个简单局域网并联入外网
  7. 图形旋转的C语言源程序
  8. centos7下安装docker(14安装docker machine​)
  9. 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
  10. 我的angularjs源码学习之旅2——依赖注入