字节(byte)与字符(char)的区别
字节(Byte)是计量单位, 表示数据量多少, 是计算机信息技术用于计量存储容量的一种计量单位, 通常情况下一字节等于八位。
字符(Character)计算机中使用的字母、数字、字和符号, 比如’A’、’B’、’$’、’&’等。
一般在英文状态下一个字母或字符占用一个字节, 一个汉字用两个字节表示。
字节与字符:
ASCII 码中, 一个英文字母(不分大小写)为一个字节, 一个中文汉字为两个字节。
UTF-8 编码中, 一个英文字为一个字节, 一个中文为三个字节。
Unicode 编码中, 一个英文为一个字节, 一个中文为两个字节。
符号: 英文标点为一个字节, 中文标点为两个字节。例如: 英文句号 . 占1个字节的大小, 中文句号 。占2个字节的大小。
UTF-16 编码中, 一个英文字母字符或一个汉字字符存储都需要 2 个字节(Unicode 扩展区的一些汉字存储需要 4 个字节)。
UTF-32 编码中, 世界上任何字符的存储都需要 4 个字节。
在 Golang 中, 如果字符串中出现中文字符不能直接调用 len 函数来统计字符串字符长度, 这是因为在 Go 中, 字符串是以 UTF-8 为格式进行存储的, 在字符串上调用 len 函数, 取得的是字符串包含的 byte 的个数。
每个中文字, 占3个byte。所以:
str1 := “Hello,世界”
fmt.Println(len(str1)) // 打印结果:12
英文字符仍是占一个byte。
Go语言的字符有以下两种:
一种是 uint8 类型, 或者叫 byte 型, 代表了 ASCII 码的一个字符。byte 是 uint8的别名
另一种是 rune 类型, 代表一个 UTF-8 字符, 当需要处理中文、日文或者其他复合字符时, 则需要用到 rune 类型。rune 类型等价于 int32 类型。
案例: 统计中文的个数
package main import ( "fmt" "unicode" ) func ChineseCount(str1 string) (count int) { for _, char := range str1 { if unicode.Is(unicode.Han, char) { // 判断是否是中文 count++
}
} return } func main() {
str_obj := "Hello你好WorldGo语言真强" result := ChineseCount(str_obj)
fmt.Println("result=", result) // 6 个 统计中文的中文个数 }
案例: 字符串元素的个数(英文一个, 中文一个)
package main import ( "fmt" "unicode/utf8" ) func main() {
a := "I love my family!我爱我的家人!" // 方法一: b := []rune(a) //转换为rune:一个字符对应一个元素 (共24个) fmt.Println(len(b)) //获取元素的个数(24) //方法二: 更简单的方法 utf8.RuneCountInString 专门用于计算字符数 fmt.Println(utf8.RuneCountInString(a)) // 24 for _, v2 := range b {
fmt.Printf("%c", v2) //输出结果:I love my family!我爱我的家人! }
}
案例: 获取字符串字节的个数(英文一个字节, 中文三个字节)
package main import ( "fmt" ) func main() { var str string = "abc郑闯" //共9个字节 charray := []byte(str) //转换为byte: 一个字节对应一个数组元素 fmt.Println(len(charray)) //获取元素的个数,结果为9 for _, v := range charray {
fmt.Printf("%c", v) //输出结果为:abcéé¯ }
}
字节数和字符数区别:
字节数: 因为一个字节, 中文三个字节;
字符数: 英文一个, 中文一个;
该文章投稿作者:李小白,如若转载,请注明来自鱼鳞桐程网:https://www.yulintongcheng.com/283074.html