3

字符编码/Java字符流与字节流/Buffer原理/对象序列化

声明

文章均为本人技术笔记,转载请注明出处https://segmentfault.com/u/yzwall

字符编码与编码标准

字符集:收入标准中的符号集合成为字符集

编码:将给定字符转换成底层存储字节的过程

ASCII编码

ASCII只支持英文编码,不支持其他语言;ASCII编码使用一个字节编码一个字符,一共规定了128个字符,每个字符只占用一个字节的后7位,第1位统一为0

ANSI编码

与ASCII编码相对,非英语国家自定义适合本国语言的编码标准,使用多个字节存储一个字符。但是不同ANSI编码之间互不兼容,无法将不同语言的文字存储在同一段用ANSI编码的文本中;

Unicode编码

与ANSI编码相对,国际组织制定Unicode编码,为不同语言中的每个字符规定了统一而且唯一的数字编号,实现跨语言和跨平台;

大端存储与小端存储
  • 大端存储:高位字节存储在低地址端,低位字节存储在高地址端;(高放低,低放高)

  • 小端存储:低位字节存储在低地址端,高位字节存储在高地地端;(高放高,低放低)

网络传输和x86存储均采用大端存储;在Unicode规范中,根据文本文件的头两个字节,判定采用大端存储还是小端存储:

  • 头两个字节是FE FF:大端存储;

  • 头两个字节是FF FE:小端存储;

Unicode实现方式:UTF-8

一个字符的Unicode编码是确定的,但是在实际传输过程中,有多种Unicode编码实现方式。Unicode实现方式成为Unicode转换格式(Unicode Transformation Format, UTF);UTF-8是应用最广的Unicode实现方式,使用1~4个字节存储一个字符。Unicode其他实现形式包括UTF-16(单个字符用2个或4个字节表示)和UTF-32(单个字符用4个字节表示)

UTF-8的编码规则

  • 单字节字符:字节第一位为0,后7位为该字符的Unicode编码。因此对于英文字符,UTF-8编码与ASCII编码相同;

  • 多字节字符(n > 1)

    • 第一个字节的前n位全为1,第n+1位设为0

    • 其余字节的前2位一律设为10;

    • 其余二进制位全部为该字符的Unicode编码;

汉字编码

汉字编码主要有GBK,GB2312和Big5;

  • GB2312:GB2312由国家标准总局发布,是一个简化版的汉子编码规范,又称国标码。GB2312规定对任意一个字符采用2个字节存储,每个字节采用7位编码表示;

  • GBK:GBK是GB2312的扩展,兼容GB2312,每个汉字由2个字节存储;

  • Big5:Big5是繁体字编码,每个汉子由2个字节存储;

Java字节流与字符流

Java IO系统中,

字节流基类:InputStreamOutputStream

字符流基类:ReaderWriter

字节流I/O单位是单个字节,字符流I/O单位是是由JVM将单个字节解码后的Unicode字符,Java中实际运行的只有字节流,只有对字符流进行解码操作后才能得到字符流。
Java中一个char类型采用Unicode编码,大小占两个字节,可以表示一个中文字符;C/C++中char类型采用ASCII字符集,无法表示一个中文字符;

缓冲区Buffer实现原理

字节流本质上是CPU直接与慢速存储设备进行I/O,速度较慢。由于CPU与主存的I/O速度远远高于与慢速存储设备,因此在内存中开辟一段足够大空间称之为缓冲区(Buffer),系统每次尝试先从缓冲区中读取数据,如果读取失败则选择从后备存储中读取新数据放入缓冲区中,最后将缓冲区中对应数据返回给用户。

对象序列化

对象序列化与反序列化:将Java对象转变成字节流存储,称之为对象序列化。从字节流中恢复一个Java对象,称之为对象反序列化。
序列化资格:只有实现了Serializable接口的对象,才可以被序列化。
序列化实现:通过ObjectOutputStream.writeObject(Object)将对象Object序列化;
反序列化实现:通过ObjectInputStream.readObject()反序列化一个对象;
序列化应用:对象序列化多用于分布式网络中通过RMI传输对象;

参考

[1] http://blog.csdn.net/sugar_z_/article/details/51276984
[2] http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html


yzwall
120 声望17 粉丝

对大规模分布式系统技术兴趣浓厚