golang CLI:如何检测当前终端编码并将用户输入与utf8进行转换?

时间:2016-10-06 01:23:01

标签: windows go utf-8 character-encoding cross-platform

我正在编写一个接受用户输入的golang命令行程序。此输入字符串必须转换为UTF-8并发送到另一台服务器进行处理。在Linux上,终端编码几乎总是UTF-8,但在Windows中似乎并非如此。我尝试使用

将Windows上的代码页设置为65001
chcp 65001

并确保终端字体设置为Lucida控制台。但是,

读取的字节数
fmt.Scanf()

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

Python似乎有“locale”包,它可以获得默认编码,解码和编码任何指定编码的字符串。 golang是否有相同的效果?

大多数stackoverflow讨论都指向使用chcp 65001将Windows终端上的编码更改为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:

感谢任何帮助/指针。

0 个答案:

没有答案