golang CLI:如何检测当前的terminal编码并将用户input转换为utf8?

我正在写一个接受用户input的golang命令行程序。 此inputstring必须转换为UTF-8并发送到另一个服务器进行处理。 在Linux上,terminal编码几乎总是UTF-8,但在Windows中似乎不是这种情况。 我试图使用Windows设置代码页到65001

chcp 65001 

并确保terminal字体设置为Lucida控制台。 但是,读取的字节

 fmt.Scanf() 

不是UTF-8格式。 我希望能够检测字符编码并将string转换为UTF-8。 同样,我应该能够在打印到屏幕之前从UTF-8转换为本地编码。

Python似乎有“locale”包,它可以获得默认编码,解码和编码string到任何指定的编码。 这对于golang有没有相同之处?

大部分的stackoverflow讨论都指向使用chcp 65001将windowsterminal上的编码改为UTF-8。 这似乎不适用于我。

 func main() { foo := "" fmt.Printf("Enter: ") if _, err := fmt.Scanln(&foo) ; err != nil { fmt.Println("Error while scanning: ", err) } fmt.Printf("Scanned bytes: % x", foo) fmt.Println() } 

在Linux上:

 // ASCII $ go run test.go Enter: hello Scanned bytes: 68 65 6c 6c 6f // Unicode $ go run test.go Enter: © Scanned bytes: c2 a9 // Unicode $ go run test.go Enter: ΆΏΑΓΔΘΞ Scanned bytes: ce 86 ce 8f ce 91 ce 93 ce 94 ce 98 ce 9e ce a3 ce a8 ce a9 ce aa ce ad ce b1 ce b2 ce ba 

在Windows上:

 PS C:\> chcp Active code page: 437 PS C:\> go run .\test.go Enter: hello Scanned bytes: 68 65 6c 6c 6f PS C:\> go run .\test.go Enter: ΆΏΑΓΔΘΞ Scanned bytes: 3f 3f 61 // Change to Unicode PS C:\> chcp 65001 Active code page: 65001 PS C:\> go run .\test.go Enter: ΆΏΑΓΔΘΞ Error while scanning: EOF Scanned bytes: 

欣赏任何帮助/指针。