所以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, 世界
正确。但是用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">