前几天无意中刷脉脉的时候,看到一个人吐槽微信的拍一拍尾巴的填写报错提示,其中评论区也感觉蛮多人对汉字,字符,字节这几个概念认知不够清晰。因为我之前也是做技术的,虽然很多知识概念都忘得差不多了,但是隐隐就感觉评论区说的是错误的。
于是乎我花了点时间,在网上找了一些资料和文章等,收集一波发出来,跟大家共同学习。
以下内容都是从网上找的,我会注明出处,再加上一些自己的理解和解析,以便于非技术产品也能读懂,那么我们就开始吧。
什么是字节?字节的百科定义是:
❝
字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位。
如果你只是在纸上写字,那么就用不到字节,但是如果你要把字存入电脑,就需要占用一定的磁盘空间。我们知道,电脑只能用高电位、低电位的形式存储数据,抽象出来,那就是电脑存数据最终只能用二进制的形式,也就是用0和1表示,无论任何数据,最终存储的时候都是一段包含多个0和1的串,例如“00110101”,这里的每一个0或1被称为1位。
“位”就是最小的存储单位,然后我们把8位称为1个字节,也就是1个字节等于8位。这个概念类似于“1公里=1000米”,本质上是一回事,只是使用不同级别的单位而已。由于二进制实在太长,不方便展示,所以一般将1个字节(8位)的二进制转换成十六进制进行展示,例如将11010011转换成十六进制就是D3,这就是一个字节。
我们可以看下字符“你”在UTF-8字符集下的表示方式,在MySQL中你可以直接使用 HEX() 函数来进行转换。
SELECTHEX('你')--E4BDA0
可以看出,使用UTF-8字符集,字符“你”需要使用3个字节来进行存储(分别是E4,BD,A0),实际存储的二进制是
111001001011110110100000
再次说明,E4BDA0 只是 111001001011110110100000 的简写形式,两者本质上是一回事。
我们继续看一下,存储一个英文字符需要占用多少字节。
SELECTHEX('Z')--5A
可以看到,存储英文字符“Z”只需要一个字节。
在MySQL中,你可以直接使用 LENGTH() 函数来查看指定字符串占用的空间(字节数)。
SELECTLENGTH('你')--3
SELECTLENGTH('Z')--1
SELECTLENGTH('A啊a1')--6
你可以直接记住结论:在UTF-8字符集下,一个中文字符占用3个字节,一个英文字符占用1个字节。如果要计算字符串占用的字节数,只需要按照这个方式相加即可。
什么是字符?以下是百科对字符的定义:
❝
字符指类字形单位或符号,包括字母、数字、运算符号、标点符号和其他符号,以及一些功能性符号。
为了方便理解,你可以将字符简单地理解为你可以用输入法单独打出的任何单个的内容(空格也算是字符)。对于中文和英文而言,以下内容分别都是1个字符:
(1)1个中文字,例如“是”
(2)1个英文字母,例如“T”
(3)1个中文标点符号,例如“。”
(4)1个英文标点符号,例如“.”
所谓的“字符串”就是由以上说的一个个字符组成的,字符串就是由一个个字符拼接而成的列表,以下是Javascript代码演示:
conststr='A啊a1'
console.log(str[0])//'A'
console.log(str[1])//'啊'
console.log(str[2])//'a'
console.log(str[3])//'1'
在MySQL中,你可以使用CHAR_LENGTH()函数,查看指定字符串的字符数。例如:
SELECTCHAR_LENGTH('A啊a1')--4
以上内容摘自知乎《一文搞懂字符和字节的含义》,有所删改,去掉了一些容易造成理解困难的原理等
字符编码的来龙去脉因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295。
由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。
但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。
你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。