一尘不染

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

go

我有一个exe可以打印utf-8编码的字符串的字符串,其中带有特殊字符。
由于该exe是从控制台窗口使用的,因此它的输出被修改了,因为Windows使用了ibm850编码(aka code page 850)。

您将如何确保go exe为控制台窗口打印正确编码的字符串,例如,打印:

éèïöîôùòèìë

而不是(不对正确的字符集进行任何翻译)

├®├¿├»├Â├«├┤├╣├▓├¿├¼├½

阅读 216

收藏
2020-07-02

共1个答案

一尘不染

自2016年以来,您现在(2017年)就可以考虑使用golang.org/x/text,该编码随附了编码charmap,包括ISO-8859家族和Windows
1252字符集。

请参阅“ 快速入门-在Golang中转换字符编码

r := charmap.ISO8859_1.NewDecoder().Reader(f)
io.Copy(out, r)

那是打开ISO-8859-1源文本(my_isotext.txt),创建目标文件(my_utf.txt)并将第一个复制到第二个示例的摘录。
但是,要从ISO-8859-1解码为UTF-8,我们需要f使用解码器包装原始文件阅读器()。

我刚刚测试过(用于说明的伪代码):

package main

import (
    "fmt"

    "golang.org/x/text/encoding"
    "golang.org/x/text/encoding/charmap"
)

func main() {
    t := "string composed of character in cp 850"
    d := charmap.CodePage850.NewDecoder()
    st, err := d.String(t)
    if err != nil {
        panic(err)
    }
    fmt.Println(st)
}

结果是Windows CMD中可读的字符串。
2018年11月的Reddit线程中查看更多信息。

2020-07-02