How to properly output a string in a Windows console with go?

前端 未结 4 1072
难免孤独
难免孤独 2021-01-04 13:32

I have a exe in go which prints utf-8 encoded strings, with special characters in it.
Since that exe is made to be used from a console window, its output is

4条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-04 13:58

    The online book "Network programming with Go" (CC BY-NC-SA 3.0) has a chapter on Charsets (Managing character sets and encodings), in which Jan Newmarch details the conversion of one charset to another. But it seems cumbersome.

    Here is a solution (I might have missed a much simpler one), using the library go-charset (from Roger Peppe).
    I translate an utf-8 string to an ibm850 encoded one, allowing me to print in a DOS windows:

    éèïöîôùòèìë
    

    The translation function is detailed below:

    package main
    
    import (
        "bytes"
        "code.google.com/p/go-charset/charset"
        _ "code.google.com/p/go-charset/data"
        "fmt"
        "io"
        "log"
        "strings"
    )
    
    func translate(tr charset.Translator, in string) (string, error) {
        var buf bytes.Buffer
        r := charset.NewTranslatingReader(strings.NewReader(in), tr)
        _, err := io.Copy(&buf, r)
        if err != nil {
            return "", err
        }
        return string(buf.Bytes()), nil
    }
    
    func Utf2dos(in string) string {
        dosCharset := "ibm850"
        cs := charset.Info(dosCharset)
        if cs == nil {
            log.Fatal("no info found for %q", dosCharset)
        }
        fromtr, err := charset.TranslatorTo(dosCharset)
        if err != nil {
            log.Fatal("error making translator from %q: %v", dosCharset, err)
        }
        out, err := translate(fromtr, in)
        if err != nil {
            log.Fatal("error translating from %q: %v", dosCharset, err)
        }
        return out
    }
    
    func main() {
        test := "éèïöîôùòèìë"
        fmt.Println("utf-8:\n", test)
        fmt.Println("ibm850:\n", Utf2dos(test))
    }
    

提交回复
热议问题