参考文章: http://c.biancheng.net/view/36.html
1. 获取ascii类型字符的长度个数和获取utf8类型字符长度的个数
a. len("咪咪") //return 6 这获取的是ASCII长度
b.utf8.RuneCountInString("咪咪") // return 2获取的是utf8汉字长度个数
2. 字符串遍历, 以ASCII方式遍历和以Unicode方式遍历
// 测试字符串长度 str := "我是 abcd" // ASCII码类型遍历 for i := 0; i < len(str); i++ { fmt.Printf("ASCII %c, %d\n", str[i], str[i]) } // unicode码类型遍历 for _, s := range str { fmt. Printf("Unicode %c, %d \n", s, s) }
输出结果
ASCII æ, 230 ASCII , 136 ASCII , 145 ASCII æ, 230 ASCII , 152 ASCII ¯, 175 ASCII , 32 ASCII a, 97 ASCII b, 98 ASCII c, 99 ASCII d, 100 Unicode 我, 25105 Unicode 是, 26159 Unicode , 32 Unicode a, 97 Unicode b, 98 Unicode c, 99 Unicode d, 100
可以看到以ASCII方式插入的代码是有乱码的, 我们可以以unicode方式打印处理. 这两者的区别在于使用哪一种for循环
ASCII: 使用for 下标遍历, 后面的数字表示的是在ASCII中的编码.
Unicode: 使用 for range遍历. 后面的数字表示的是, 在unicode中的编码
扩展: UTF-8 和 Unicode 有何区别?
Unicode 与 ASCII 类似,都是一种字符集。
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。而无论任何情况下,Unicode 中的字符的 ID 都是不会变化的。
UTF-8 是编码规则,将 Unicode 中字符的 ID 以某种方式进行编码,UTF-8 的是一种变长编码规则,从 1 到 4 个字节不等。编码规则如下:
- 0xxxxxx 表示文字符号 0~127,兼容 ASCII 字符集。
- 从 128 到 0x10ffff 表示其他字符。
根据这个规则,拉丁文语系的字符编码一般情况下每个字符占用一个字节,而中文每个字符占用 3 个字节。
广义的 Unicode 指的是一个标准,它定义了字符集及编码规则,即 Unicode 字符集和 UTF-8、UTF-16 编码等。
参考: http://c.biancheng.net/view/18.html
3. 类型强转
1 //类型强转 2 str := "这是一个aaa" 3 bytestr := []byte(str) 4 fmt.Println(bytestr) 5 fmt.Println(string(bytestr))
a. string强转成byte: []byte(str)
b. byte强转成string: string(byte)
4. 高效字符串拼接方式
1 //字符串拼接 2 hammer := "吃我一锤" 3 sickle := "死吧" 4 5 /** 普通字符串拼接方式 */ 6 hammer += sickle 7 fmt.Println(hammer) 8 fmt.Println(sickle) 9 10 /** 高效字符串连接的方式 */ 11 // 声明字节缓冲区 12 var stringBuilder bytes.Buffer 13 14 //把字符串写入缓冲 15 stringBuilder.WriteString(hammer) 16 stringBuilder.WriteString(sickle) 17 18 // 将缓冲以字符串形式输出 19 fmt.Println(stringBuilder.String())
输出:
1 吃我一锤死吧 3 死吧 4 吃我一锤死吧死吧
简单的东西未必高效。除了加号连接字符串,Go 语言中也有类似于 StringBuilder 的机制来进行高效的字符串连接
5. 常用的一些格式化样式中的动词及功能
表:字符串格式化时常用动词及功能
动 词 | 功 能 |
%v | 按值的本来值输出 |
%+v | 在 %v 基础上,对结构体字段名和值进行展开 |
%#v | 输出 Go 语言语法格式的值 |
%T | 输出 Go 语言语法格式的类型和值 |
%% | 输出 % 本体 |
%b | 整型以二进制方式显示 |
%o | 整型以八进制方式显示 |
%d | 整型以十进制方式显示 |
%x | 整型以十六进制方式显示 |
%X | 整型以十六进制、字母大写方式显示 |
%U | Unicode 字符 |
%f | 浮点数 |
%p | 指针,十六进制方式显示 |
6.
7.