常见字符编码有以下几种:
- ISO-8859-1:属于定长(单字节)编码,只能表示0~255的字符范围(包括标准ASCII和扩展ASCII),主要在英文上应用。
- GBK/GB2313:属于非定长编码,包含单字节(半角符号)和双字节(全角符号)编码,单字节兼容ASCII,GB2313只有简体汉字,GBK包含简体和繁体汉字,向下兼容GB2313。
- UNICODE:属于定长(双字节)编码,java中就是使用这种编码方式,英文也使用双字节的编码方式。
- UTF-8:属于非定长编码,英文部分使用单字节,更节省储存空间。
编码就是指将字符转换成字节的过程,解码就是指将字节转换成字符的过程。字符是通过字节来存储的,通常我们所说的乱码就是往文件中存储字符所用的默认编码方式与解析文件中的字符所用的默认解码方式不同造成的。
解决办法就是生成文件时以特定编码方式来存储字符或读取文件时以特定解码方式来读取字符:
存储字符:
//生成字符串s后,以UTF-8的编码方式来获取编码,而非用本机默认的方式来编码
byte[] bytes = s.getBytes("UTF-8");
//默认使用本机的编码方式:
byte[] bytes = s.getBytes();
读取字符:
//从文件中读取byte[] bytes后,以之前生成此文件的编码方式解码,而非使用本机默认的解码方式
String s = new String(bytes,"UTF-8");
//默认是用本机的解码方式:
String s = new String(bytes);