Golang:为什么终端标准输出不打印出 UTF-8 字符



所以golang被设计为正确处理unicode/utf-8。

但是,我似乎无法在终端的标准输出中正确打印出 utf-8 字符。

这里最简单的程序:-

package main
import "fmt"
func main() {
    fmt.Println("Hello, 世界")
}

执行时,显示编码字符。

$ go run hello.go
Hello, 世界

我的终端区域设置正确:

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

我正在使用 vim 和 set encoding=utf-8set fileencodings=utf-8 包含在我的.vimrc文件中。

这实际上可能是一个vim问题。我曾经nano从头开始编写这个脚本并将其命名为hello2.go,打印输出实际上打印Hello, 世界正确。但是用vim创建的原始hello.go脚本只给了我胡言乱语Hello, ‰∏ñÁïå.

因此,只需仔细检查我的 vim 创建的hello.go脚本是否是 UTF-8 Unicode 文本,我就在其上运行 file 命令。喜欢这个:-

$ file hello.go
hello.go: C source, UTF-8 Unicode text

那么什么给了呢? 为什么我的 vim 在上面创建了hello.go脚本打印出乱码,而我的 nano 创建的脚本hello2.go(包含完全相同的代码行(却没有?

$ file hello2.go
hello2.go: C source, UTF-8 Unicode text

事实上,当我用 nano 打开 vim 创建的hello.go时,源代码现在为:

package main
import "fmt"
func main() {
        fmt.Println("Hello 世界")
}

但是如果我用 vim 打开同一个 vim 创建的hello.go,源代码如下:

package main
import "fmt"
func main() {
    fmt.Println("Hello, 世界")
}

为什么会这样?

这些是我.vimrc中导致我这个问题的冒犯性线条。

if has("gui_running")
    set guitablabel=%t%=%m  "Set the label of the tabs
    set nomacatsui anti enc=utf-8 tenc=macroman gfn=Monaco:h11
    " set window size
    set lines=40
    set columns=120
else
    set enc=utf-8 tenc=macroman gfn=Monaco:h11
    set fenc=utf-8
endif

具体来说,tenc=macroman在终端级别搞砸了我的编码。

把它换成tenc=utf-8,一切都很好。

在这个我应该看到这个即将到来的问题上浪费了我生命的 4 个小时!呸。

该问题很可能与Windows"命令提示符"(控制台(工具属性中使用的字体有关。

单击左上角的菜单图标,选择"属性",然后"字体"选项卡。在我的Windows 8.1机器上,默认值是"光栅字体",我得到问号?????而不是Unicode字符,在Go Lang程序中由UTF8编码。

解决方案是选择TrueType字体之一,"Consolas"或"Lucida Console">

相关内容

  • 没有找到相关文章

最新更新