比特
- 计算机专业术语,是信息量单位,是由英文
BIT
音译而来。 - 二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。
- 二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特。
- 计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。
- 比特就是 bit(可以简写为b),就是位,是数据存储的最小单位。</br>
- bit=位=比特
字节
- 字节是现代计算机中连续的、固定数量的比特(二进制):八个比特为一字节
- 英文Byte翻译就是字节
- 字节就是Byte(可以简写为B),一字节就等于(占)8比特,就等于(占)8位</br>
1字节=8比特=8bit=8位
java中基本数据类型
类型|字节数|(二进位制)位数|最小|最大|默认|其他
--|--|--|--|--|--|--|--
byte|1|8|-128(-27)|127(27-1)|0|
short|2|16|-32768(-215)|32767(215-1)|0|
int|4|32|- 2,147,483,648(-231)|2,147,483,647(231 -1)|0|
long|8|64|-9,223,372,036,854,775,808(-2^63)|9,223,372,036,854,775,807 (2^63 -1)|0L|
float|4|32|||0.0f|
double|8|64|||0.0d|
boolean||1|||false|
char|2|16||||
字符与编码
- ASCII码
字符编码,统一规定了英语字符与二进制位之间的关系。
ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。 - Unicode
Unicode涵盖了各个国家语言可能出现的符号和文字,并将为他们编号,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字"严"。
Unicode只是一个编码字符集。
Unicode只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
字库表(character repertoire):一个相当于所有可读或者可显示字符的数据库,决定了整个字符集能够展现表示的所有字符的范围。
编码字符集(coded character set):用一个编码值code point来表示一个字符在字库中的位置。
字符编码(character encoding form):编码字符集和实际存储数值之间的转换关系。
Unicode是一个简单的标准,用来把字符映射到数字上(可以这样理解:选取一个具体的数字范围,然后将范围中的数字设置定义为码位,然后为每个码位编制一个文字符号,这样文字符号就和数字建立了一一对应的关系。Unicode就是制定了这样一种关系。而UTF-8实现,是指怎样将这个码位存储起来,是1个字节还是2个字节,还是多个字节)。Unicode协会的人会帮你处理所有幕后的问题,包括为新字符指定编码。Unicode并不告诉你字符是怎么编码成字节的。这是被编码方案决定的,通过UTF来指定。
- UTF-8
UTF-8是一种字符编码,是Unicode规则字库的一种实现形式(从UTF-8的全称8-bit Unicode Transformation Format可以辅助理解这一点,utf-16,utf-32都是Unicode规则字库的一种实现形式)。
Unicode的编号从0000开始一直到10FFFF共分为17个Plane(016),每个Plane中有65536个字符。而UTF-8则只实现了第一个Plane,可见UTF-8虽然是一个当今接受度最广的字符集编码,但是它并没有涵盖整个Unicode的字库,这也造成了它在某些场景下对于特殊字符的处理困难~ - UTF-8编码为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。它可以使用1~6个字节表示一个符号(这句话可以参考维基百科的说明来理解),根据不同的符号而变化字节长度。
- 对一个英文字母,在UTF-8编码方式下占用1个字节
- 对一个数字,在UTF-8编码方式下占用1个字节
- 对一个汉字而言,在UTF-8编码方式下2-4个字节(没有找到标准解答,一般为3到4个字节)
- ISO-8859-1
共能表示 256 个字符,占用1个字节 - GB2312和GBK
GB2312全称是《信息交换用汉字编码字符集 基本集》,总的编码范围是 A1-F7,其中从 A1-A9 是符号区,总共包含 682 个符号,从 B0-F7 是汉字区,包含 6763 个汉字。GBK全称叫《汉字内码扩展规范》,是国家技术监督局为 windows95 所制定的新的汉字内码规范,它的出现是为了扩展 GB2312,加入更多的汉字,它的编码范围是 8140~FEFE(去掉 XX7F)总共有 23940 个码位,它能表示 21003 个汉字,它的编码是和 GB2312 兼容的,也就是说用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。
对GB2312和GBK而言: - 对一个英文字母或者一个数字,占用1个字节
- 对一个汉字而言,占用2个字节
为什么只会出现汉字乱码,英文字母和数字却不会:ASCII最先使用,其它的字符集都兼容ASCII
-
内码和外码
内码(internal encoding):程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码;
外码(external encoding):程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。
这里可以参考Java 字符串编码
更多参考
字符集和字符编码
编码研究笔记
学点编码知识又不会死:Unicode的流言终结者和编码大揭秘
十分钟搞清字符集和字符编码
UTF-8
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
程序员趣味读物:谈谈Unicode编码
字符集编码与乱码文集