2

因此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"

我正在使用 vimset encoding=utf-8set 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

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

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

事实上,当我打开 vim-created hello.gowithnano时,源代码现在显示为:-

package main

import "fmt"

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

但是如果我打开同一个 vim-created hello.gowith vim,源代码如下:-

package main

import "fmt"

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

为什么会这样?

4

2 回答 2

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 个小时!啊。

于 2013-02-17T09:41:33.807 回答
1

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

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

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

于 2015-06-28T19:38:38.893 回答