36 | unicode与字符编码
该思维导图由 AI 生成,仅供参考
Go 语言经典知识总结
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了Go语言中的Unicode与字符编码的基础知识,包括Unicode编码规范、UTF-8编码格式以及Go语言对字符串和字符的处理方式。文章首先介绍了Go语言的重要概念和语法,包括并发编程模型、数据类型、语法特点以及测试和同步工具。随后详细讨论了字符编码方面的问题,包括ASCII编码和Unicode编码规范,强调了Go语言源码文件必须使用UTF-8编码格式进行存储。此外,文章还介绍了UTF-8、UTF-16和UTF-32这三种不同的编码格式,以及它们的特点和优势。通过具体的代码示例,读者可以更好地理解Go语言中的字符编码基础知识。文章还提出了一个问题,引导读者思考`string`类型值在底层是如何被表达的。总的来说,本文内容丰富,涵盖了Go语言中的Unicode与字符编码的基础知识,对于想要深入了解Go语言编程的读者来说,是一篇值得阅读的文章。
《Go 语言核心 36 讲》,新⼈⾸单¥59
全部留言(35)
- 最新
- 精选
- lesserror郝林老师,请问一下:“基于混合线程的并发编程模型”。这句话该怎么理解呢?
作者回复: 这里所谓的混合线程就是:OS内核外的线程/协程 + OS内核里的系统线程。 它牵扯到了两个程序级别,一个是用户级,一个是内核级,所以也叫“混合”或“两级”的线程模型。从数量对应的角度讲,它也叫M:N的线程模型(M指核外线程数量,N指核内线程数量),即两者之间是动态匹配的。你想想看,goroutine和系统线程是不是动态匹配的。Go语言的并发模型中不止有混合线程,但底层是基于此的。 相对应的,Java用的是1:1的纯内核级线程模型,也就是说JVM中的一个线程就等同于内核中的一个系统线程,一一对应。 还有就是,Python的绿色线程,是M:1的纯用户级线程模型。同进程内的多个绿色线程实际上共用一个线程,它们并不是真的并发执行(共用一个线程不可能出现并发执行的情况),只是通过调度看起来像并发执行而已。
2021-08-236 - 小虾米这篇文章把unicode和utf8区分的不是很清楚,正如上面有个网友说的rune切变16进制输出是字符的unicode的码点,而byte切片输出的才是utf8的编码
作者回复: 这么说没错,不过rune在底层也是字节串。
2018-12-1646 - 🐻+ isrunesingle.go ```go package show_rune_length func isSingleCharA(c rune) bool { return int32(c) < 128 } func isSingleCharB(c rune) bool { data := []byte(string(c)) return len(data) == 1 } func isSingleCharC(c rune) bool { data := string(c) + " " for i, _ := range data { if i == 0 { continue } if i == 1 { return true } else { return false } } return false } ``` + isrunesingle_test.go ```go package show_rune_length import ( "testing" "github.com/stretchr/testify/assert" ) type CharJudger func(c rune) bool func TestIsSingleChar(t *testing.T) { for _, judger := range []CharJudger{ isSingleCharA, isSingleCharB, isSingleCharC, } { assert.True(t, judger('A')) assert.True(t, judger(rune(' '))) assert.False(t, judger('😔')) assert.False(t, judger('爱')) } } ```
作者回复: 可以用 unicode/utf8 代码包中的 RuneCount 函数。
2019-04-224 - Gryllus终于追上了进度
作者回复: 🐂
2018-11-023 - 安排一个unicode字符在内存中存的是码点的值还是utf8对应的编码值?
作者回复: 内存里存的是 UTF-8 的编码值,会由 1~4 个字节组成。Unicode 代码点是 Unicode 标准中用来唯一标识字符的东西。
2019-09-1822 - qiushyestr := "Go 爱好者 "fmt.Printf("Th... 您在文章里举的这个例子在Go后面多加了空格,会让人误解成遍历字符串可以跳过空格,github代码里没问题。
作者回复: 收到,谢谢。已经通知编辑修正了。
2019-09-0522 - 文武木子十六进制四个数字不是一共占用32位吗,一个字节不是8位嘛,这样不是占用4个字节吗?求大神解答
作者回复: 你想问什么?十六进制的一位相当于二进制的四位。
2019-10-1021 - 党一个unicode字符点都是由两个字节存储,为什么在go语言中 type rune = int32 四个字节 而不是 type rune=16 两个字节啊
作者回复: Unicode 代码点是一个抽象的概念,并且没有规定占用的字节数,只是说以“U+XXXX”的形式来表示。“X”还可能有 5 个或 6 个。 Unicode 代码点是 Unicode 编码标准的一部分。但你要分清楚编码标准和编码格式(像 UTF-8、UTF-16 等等)的区别。前者是概念和表示法,后者是真正的落地格式。编码格式才是真正与存储占用(比如一个字符占用多少个字节)有关的东西。 rune 类型的宽度是 4 个字节,那是因为 Go 语言使用 UTF-8 编码格式。这种格式编出来的码最多占用 4 个字节。
2019-07-301 - Geek_479239谢谢老师,这篇很有收获
作者回复: 不客气,加油!
2022-04-20 - William Ning打卡,一直不明白字符集unicode与字符编码utf-8以及其他的编码实现方式的区别,现在有些理解,但是还是需要理一理。
作者回复: 你还可以看看这篇文章:https://mp.weixin.qq.com/s/syyKS7lztRGTu1t00YhoFA ,我的另一本书的免费章节。
2022-02-18