为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用go在Windows控制台中正确输出字符串?

如何使用go在Windows控制台中正确输出字符串?

Go
饮歌长啸 2021-05-13 18:19:54
我有一个exe可以打印utf-8编码的字符串的字符串,其中带有特殊字符。由于该exe是从控制台窗口使用的,因此它的输出被修改了,因为Windows使用了ibm850编码(aka code page 850)。您如何确保goexe为控制台窗口打印正确编码的字符串,例如,打印:éèïöîôùòèìë而不是(不对正确的字符集进行任何翻译)├®├¿├»├Â├«├┤├╣├▓├¿├¼├½
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

// Alert: This is Windows-specific, uses undocumented methods, does not

// handle stdout redirection, does not check for errors, etc.

// Use at your own risk.

// Tested with Go 1.0.2-windows-amd64.


package main


import "unicode/utf16"

import "syscall"

import "unsafe"


var modkernel32 = syscall.NewLazyDLL("kernel32.dll")

var procWriteConsoleW = modkernel32.NewProc("WriteConsoleW")


func consolePrintString(strUtf8 string) {

    var strUtf16 []uint16

    var charsWritten *uint32


    strUtf16 = utf16.Encode([]rune(strUtf8))

    if len(strUtf16) < 1 {

        return

    }


    syscall.Syscall6(procWriteConsoleW.Addr(), 5,

        uintptr(syscall.Stdout),

        uintptr(unsafe.Pointer(&strUtf16[0])),

        uintptr(len(strUtf16)),

        uintptr(unsafe.Pointer(charsWritten)),

        uintptr(0),

        0)

}


func main() {

    consolePrintString("Hello ☺\n")

    consolePrintString("éèïöîôùòèìë\n")

}


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 297 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信