流与文件 <-> 编码
为什么要进行编码
计算机无法理解我们人类使用的语言,只能识别0或者1。所以,为了使计算机能够理解我们所使用的语言,我们需要通过翻译的过程,将其翻译成计算机能够理解的语言。这个翻译的过程就是编码。多数计算机使用8位的块,或者字节(byte)作为最小的可寻址的存储器单位,而不是在存储器中访问单独的位。
因此我们可知:
1、计算机中存储信息的最小单元是一个字节即 8 个 bit,所以能表示的字符范围是 0~255 个
2、人类要表示的符号太多,无法用一个字节来完全表示
3、要解决这个矛盾必须需要一个新的数据结构 char,从 char 到 byte 必须编码
常用编码格式
ASCII 码
标准ASCII 码也叫基础ASCII码,使用字节低7 位二进制数来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。0~31 是控制字符如换行回车删除等;32~126 是打印字符,可以通过键盘输入并且能够显示出来。ISO-8859-1
以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,涵盖了大多数西欧语言字符,所有应用的最广泛。ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。GB2312 & GBK
双字节编码,GBK兼容GB2312 ,可以用 GB2312 编码的汉字可以用 GBK 来解码,并且不会有乱码。UTF-8 & UTF-16 & UTF-32
Unicode将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码。但它只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储实现。
UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示)。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
链接:( Unicode存在的问题 | Unicode与UTF-8之间的转换)
参考文献:
[1] Java字符编码根本原理
[2] JAVA字符串与字符编码处理的终极解决
[3] 深入分析 Java 中的中文编码问题
[4] 字符编码笔记:ASCII,Unicode和UTF-8