/字符集与字符编码的关系
(1)字符集(Charset):字符集是一个系统支持的所有抽象字符的集合。

(2)字符编码(Character Encoding):即在符号集合与数字系统之间建立对应关系.

(3)字符集对应有一套编码标准.并且一般编码标准对应有编码存储实现(或者存储实现就是使用标准编码).如Unicode编码标准有UTF-16, UTF-32, UTF-8等存储实现,叫做Unicode转换格式(UTF);GBK的标准编码应该也用做存储实现,GBK要转到UTF-8需要先转到Unicode,再转到UTF-8.

/在jvm内部,统一使用2个字节(16位)的Unicode编码来表示一个字符,Unicode编码只是对全球所有字符的映射(但2个字节是不够用的),解析时2个字节2个字节地解析,而其他编码可能灵活地用一个或多个字节对应一个字符,解析时要遵从特有的规则.

/utf-8编码中,一个英文字母用一个字节表示,一个中文字符用三个字节表示...

/new String(str.getBytes(encoding), encoding)

(1)getBytes(encoding)会让JVM进行一次Unicode编码(字符)到指定编码之间的转换。即unicode双字节转换成指定编码集的字节数组,如utf-8会把unicode双字节对应的英文字母转换成单字节,把unicode双字节对应的中文字转换成三个字节.

(2)new String()会用指定的字符集编码将字节数组转换为unicode编码保存在内存.即将字节数组以指定的编码集去解析划分,然后再转换成unicode编码形式的字节数组.如utf-8,则根据原始字节数组的每一位0/1数据,分析出英文字母或中文字,把某个字节划分为一个单位对应一个英文字母,把某三个连续字节划分为一个单位对应一个中文,....,然后再把英文字母或中文字转换成对应的unicode双字节,保存在偶数个元素个数的字节数组中.

/平台默认的字符集:

/如果程序在eclipse中运行,那么使用的是eclipse工程的字符集编码.如果脱离了eclipse的托管独立在操作系统中运行,那么是使用系统平台默认的编码.一般中文平台是使用GBK,英文平台是使用Cp1252

/面向字节的输入输出流与面向字符的输入输出流
(1)首先,文件中的内容都是以特定编码对应字节的形式保存的,保存到文件中的字节究竟是何种编码,由文件编辑器按某种方法去识别,文件被读进内存,可以按字符读入(需要告诉程序按什么编码去分析字节),也可以按字节读入(将字节按顺序读入即可)

(2)如果面向字节,那么从输入流中读取或者从输出流中写入都是以字节为单位的

(3)如果面向字符,那么从输入流中读取或者从输出流中写入都是以字符为单位的,具体每个字符包含多少个字节,要看平台默认的编码格式,如果编码格式不对应,那么字符会变成乱码.

(4)注意Reader和Writer只会使用平台默认的编码方案进行转换,而不能指定转换时使用的编码.

(5)如果用到系统默认的编码以外的文件,就必须采用编码转换:一个字符与字节之间的转换,即:InputStreamReader和OutputStreamWriter,这两个类是字节流和字符流之间的适配器类,承担编码转换的任务.

InputStreamReader:使用指定的 charset 读取字节并将其解码为字符。即由字节数组解析为特定的编码,再转为unicode存储

OutputStreamWriter:可使用指定的 charset 将要写入流中的字符编码成字节。即把unicode表示的字节数组映射为特定编码的字节数组