比特--字节--字符--编码

比特(bit) =(经过分组编码)=> 字节(Byte) =(经过字符集编码)=> 字符

比特=bit=位 是数据存储的最小单位

1字节=8比特=8bit=8位

字符 = 字节+字符集

原文 比特–字节–字符–编码

比特

  • 计算机专业术语,是信息量单位,是由英文BIT音译而来。

    二进制数系统中,每个0或1就是一个位(bit),位是数据存储的最小单位。

    二进制数的一位所包含的信息就是一比特,如二进制数0100就是4比特。

    计算机中的CPU位数指的是CPU一次能处理的最大位数。例如32位计算机的CPU一次最多能处理32位数据。

  • 比特就是 bit(可以简写为b),就是位,是数据存储的最小单位。
  • bit=位=比特

字节

  • 字节是现代计算机中连续的、固定数量的比特(二进制):八个比特位为一字节
  • 英文Byte翻译就是字节
  • 字节就是Byte(可以简写为B),一字节就等于(占)8比特,就等于(占)8位

1字节=8比特=8bit=8位

java中基本数据类型

类型 字节数 (二进位制)位数 最小 最大 默认 其他
byte 1 8 $-128(-2^7)$ $127(2^7-1)$ 0
short 2 16 $-32768(-2^ {15})$ $32767(2^{15}-1)$ 0
int 4 32 $- 2,147,483,648(-2^{31})$ $2,147,483,647(2^{31} -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编码
字符集编码与乱码文集

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2023 高行行
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信