在 go 中。有 byte, string 以及 rune.
虽然很常见的,但是如果要理解他们的区别还是很重要的,不然可能就犯错误了。
比如索引字符串中的第n个字符,但是如果仅仅使用下标去索引,就大错特错了。
string
在go中, string不是面向字符的,仅仅是byte的数组
我们可以通过打印来查看
事先说明:
%x: 将其16进制数打印.
%q: 打印并且过滤掉不可以打印的字节
%+q: + 等于 plus, 这个不只可以过滤不可以打印的字符,而且可以过滤掉不是 ascii的字符会翻译成 UTF-8
上例子
const sample = "\xbd\xb2\x3d\xbc\x20\xe2\x8c\x98"
fmt.Printf("%x\n", sample) // bdb23dbc20e28c98
fmt.Printf("% x\n", ) // bd b2 3d bc 20 e2 8c 98
fmt.Printf("%q\n", sample) // "\xbd\xb2=\xbc ⌘"
fmt.Printf("%+q\n", sample) //"\xbd\xb2=\xbc \u2318"
另外一个例子: 我们通过三种方式打印这个字符
const placeOfInterest = `⌘`
fmt.Printf("只是打印 string: %s\n", placeOfInterest)
fmt.Printf("quoted string: %+q\n", placeOfInterest)
fmt.Printf("string的16进制: % x\n", placeOfInterest)
fmt.Printf("string的16进制: %d\n", len(placeOfInterest))
输出结果
只是打印 string: ⌘
quoted string: "\u2318"
string的16进制: e2 8c 98
获取很懵逼,但是看下面一段代码
// 我们将 e2 8c 98 的 16进制化为10进制
fmt.Printf("%s\n", []byte{226, 140,152 })
输出:
⌘
意味着 ⌘ 这个字符的 unicode编码为 U+2318, 代表的字节为 e2 8c 98
这意味着这些字节的 utf-8 编码为 2318
rune
rune 在 go 中是 int32 别名。 是为了解决 utf-8 中编码不一致的问题。用 int32 去直接存储 code-point (码点) ,即为rune 。来表示一个 utf-8的编码。
例如:
⌘
的 unicode 的值为 \u2318。
那么, 将 2318 为16进制,化为10进制后就为 8984
var rn rune = 8984
fmt.Printf("rune=%q\n", rn)
输出结果即为
⌘