作者回复: 🐂
作者回复: 内存里存的是 UTF-8 的编码值,会由 1~4 个字节组成。Unicode 代码点是 Unicode 标准中用来唯一标识字符的东西。
作者回复: 收到,谢谢。已经通知编辑修正了。
作者回复: 可以用 unicode/utf8 代码包中的 RuneCount 函数。
作者回复: 这么说没错,不过rune在底层也是字节串。
作者回复: 首先不存在6个字节的utf8编码的字符,只有1~4个字节的。其次,unicode/utf8把里有相应的API。要看原理,看它的源码就好了。
作者回复: 你想问什么?十六进制的一位相当于二进制的四位。
作者回复: Unicode 代码点是一个抽象的概念,并且没有规定占用的字节数,只是说以“U+XXXX”的形式来表示。“X”还可能有 5 个或 6 个。
Unicode 代码点是 Unicode 编码标准的一部分。但你要分清楚编码标准和编码格式(像 UTF-8、UTF-16 等等)的区别。前者是概念和表示法,后者是真正的落地格式。编码格式才是真正与存储占用(比如一个字符占用多少个字节)有关的东西。
rune 类型的宽度是 4 个字节,那是因为 Go 语言使用 UTF-8 编码格式。这种格式编出来的码最多占用 4 个字节。
作者回复: 内存上的也是二进制储存的啊,Unicode 只是一个字符编码标准,不是编码格式。
作者回复: 你要知道,string 类型的值本身就是由 UTF-8 编码的一个个字节组成的,同时也可以看做是由一个个 Unicode 字符组成的。这不是在转换的时候才去做的。
你既然已经找到了 stringtoslicebyte 函数,那就应该再去看看那个源码文件中的其他代码。可以从 rawstring 函数看起。等都看完了你就应该明白了。
作者回复: 存储的时候会以二进制的形式。另外如果你要看Unicode代码点。你这么转换比较混乱。你可以参看fmt包的文档,看看怎样才能把对应的进制值打印出来。
作者回复: rune的底层表达使用的是Unicode代码点。
但是,底层的存储用UTF-8编码。
表达和存储这两者的关系你能分清楚吧?