golang:为什么终端stdout没有打印掉utf-8字符?

时间:2013-02-17 06:46:06

标签: vim go iterm

所以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-8文件中包含set fileencodings=utf-8.vimrc

这实际上可能是vim问题。我使用nano从头开始编写此脚本,并将其命名为hello2.go,打印输出实际上正确打印Hello, 世界。但是,使用hello.go创建的原始vim脚本只会给我带来胡言乱语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

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

package main

import "fmt"

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

但是如果我用hello.go打开相同的vim创建的vim,源代码会显示: -

package main

import "fmt"

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

为什么会这样?

2 个答案:

答案 0 :(得分:5)

这是我.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个小时的生命!啊。

答案 1 :(得分:1)

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

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

解决方案是选择一种TrueType字体,“Consolas”或“Lucida Console”