string 与 rune 的设计哲学:为什么Go 程序员很少为“乱码”烦恼?

本文永久链接 – https://tonybai.com/2025/10/13/string-and-rune-in-go 大家好,我是Tony Bai。 “为什么我的字符又乱码了?!” 这是一个在软件开发历史上,曾让无数程序员彻夜难眠的哀嚎。处理文本,是编程中最基础的任务之一,但其背后关于编码 (Encoding) 和字符集 (Character Set) 的水,远比看起来要深。正如 Joel Spolsky 在其经典文章中疾呼的那样,这是每位软件开发者都必须了解的“绝对最低限度”的知识。 ...

October 13, 2025 · 8 min · Tony Bai

图解中文字符编码-Go语言例解

今天几个同事在处理一个有关中文字符编码的问题,感觉他们对字符编码这件事依然理解不够透彻。这里用图文方式对中文字符编码做一个简要的解释,例子使用Go语言。 我们知道每个英文字母和数字在计算机中都会对应一个字节,或者说用一个字节来表示,这就是最初的ASCII码。但是随着计算机在全球范围内的广泛使用,非英语国家也要在计算机使用自己的字符,于是出现了字符集“百花齐放”的情况,我国在早期也颁布了自己的中文字符集标准。字符集一多,难免出现字符集编码不兼容的情况,比如:A字符集中某字符X的编码值是Y,但是在B字符集中Y这个值所表示的字符却是Z,这种不兼容的情况在一段时间内长期存在,导致因字符集导致的传输、处理、呈现、存储等问题常常发生,非常恼人。直到Unicode(万国码/统一码)在1994年发布,人类终于有了以统一人类所有字符为目的的统一字符集。Unicode的普及也是花费了不少的时间。但在2019年的今天,世界上绝大多数系统都支持了Unicode。 ...

November 7, 2019 · 7 min · Tony Bai

关于Go,你可能不注意的7件事

Go以简洁著称,但简洁中不乏值得玩味的小细节。这些小细节不如goroutine、interface和channel那样"高大上",“屌 丝"得可能不经常被人注意到,但它们却对理解Go语言有着重要的作用。这里想挑出一些和大家一起通过详实的例子来逐一展开和理解。本文内容较为基础,适合初学者,高手可飘过:) 一、源文件字符集****和字符集编码 Go源码文件默认采用Unicode字符集,Unicode**码点(code point)和内存中字节序列(byte sequence)**的变换实现使用了UTF-8:一种变长多字节编码,同时也是一种事实字符集编码标准,为Linux、MacOSX 上的默认字符集编码,因此使用Linux或MacOSX进行Go程序开发,你会省去很多字符集转换方面的烦恼。但如果你是在Windows上使用 默认编辑器编辑Go源码文本,当你编译以下代码时会遇到编译错误: ...

September 17, 2015 · 20 min · Tony Bai

使用iconv做内码转换

前不久某南方省份的客户反馈说我们的产品对某些生僻字(如“赟”)的转码支持的不好,终端收到后无法显示这个字。 经分析,发现类似“赟”这样的字在GB2312编码标准中并未收录,要想支持这样的生僻字的内码转换需要产品支持目前最新的中文编码标准GB18030。而我们的产品在诞生到现在就一直只支持GB2312,这就是导致这一问题的直接原因。 ...

October 31, 2009 · 3 min · Tony Bai

也谈VIM字符集编码设置

安装完中文语言包支持后,Ubuntu的默认locale是zh_CN.UTF-8(即简体中文语言环境,字符集内码UTF-8)。这与我们日常开发环境中Unix设定的环境有所区别,我们日常使用的环境一般为zh_CN.GBK或zh。我们的源代码文件的字符编码也都是GBK的编码,直接在Ubuntu下用默认设置的VIM打开后,中文的注释会显示乱码。如果你直接编辑这个文件并提交,那么其他在Unix下开发的同事Checkout这份源码后打开也将显示乱码(你新增的中文内容会是乱码)。 解决这个问题至少有两种方法:一种是为Ubuntu新增加一个zh_CN.GBK的locale的支持,内码使用GBK;另外一种就是通过设置VIM,在不变换Ubuntu所支持的locale(内码依旧是UTF-8)的情况下支持对GBK内码文件的读写。 ...

September 28, 2009 · 8 min · Tony Bai