目录
字符编码介绍
字符编码(1)
- 字符:0,a,我,1,の,...
- 计算机只用0和1,1bit(0或1)
- ASCII码(American Standard Code for Information Interchange)
- 美国信息交换标准代码,奠定计算机编码基础
- 用一个字节(1 Byte=8 bits) 来存储a-z,A-Z,0-9和一些常用符号
- 用于显示英语及西欧语言
- 回车键(13, 00001101), 0(48, 00110000), A(65,01000001), a(97, 01100001),...
字符编码(2)
- ASCII编码采用1 Byte,8 bits,最多256个字符
- ASCII无法适应其他地方,如汉字数量有十几万
所以便有了扩展编码库(加字节),如下:
- ISO8859(1-15) 西欧语言
- GB2132,GBK,GB18030(相当于是ASCII+中文)
- GB18030 > GBK > GB2312(汉字数量) - Big5(相当于是ASCII+繁中)
- Shift_JIS(相当于是ASCII+日文)
- ......
- Unicode编码(下面介绍)
字符编码(3)
- Unicode(字符集)
- 目标:不断扩充,存储全世界所有的字符
- 编码方案
- UTF-8,兼容ASCII,变长(1-4个字节存储字符),经济,方便传输(最常用)
- UTF-16,用 变长(2-4个字节)来存储所有字符(Java内部采用的编码格式)
- UTF-32,用32bits(4个字节)存储所有字符
字符编码(4)
- ANSI编码
– Windows上非Unicode的默认编码(Windows code pages)
– 在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码
– 在繁体中文Windows操作系统中,ANSI编码代表Big5
-- 记事本默认是采用ANSI保存
Java的字符编码与相关类:
Java字符编码
- 源文件编码:采用UTF-8编码
– Eclipse,右键 项目/Java文件,属性,resource,选择UTF-8 - 程序内部采用UTF-16编码存储所有字符(不是程序员控制)
- 和外界(文本文件)的输入输出尽量采用UTF-8编码
Java字符相关类的代码实践
- 获取当前默认字符集
public static void main(String[] args) { //默认字符集 GBK Charset c = Charset.defaultCharset(); System.out.println(c.name()); //输出所有的支持字符集 SortedMap<String, Charset> sm = Charset.availableCharsets(); Set<String> keyset = sm.keySet(); System.out.println("Java 支持的所有字符集"); for (String s : keyset) { System.out.println(s); } }
- 编码转换和解码
先用UTF-8编码格式将一个字符串(a)编码成字节数组,再将该字节数组以GBK的编码形式给解码成一个字符串,结果出来的结果是乱码的
然后再将乱码的结果(b)以GBK的编码格式编码成一个字节数组,最后再以UTF-8的形式将这个字节数组解码,发现还是乱码的
import java.io.UnsupportedEncodingException;
public class StringTest {
public static void main(String[] args) throws UnsupportedEncodingException {
String a = "我是中国人 ";
String b = new String(a.getBytes("UTF-8"), "GBK");
/**getBytes方法先将变量 a 中的字符串以UTF-8的编码格式转化成字节;
*而这里的new String( byte[] bytes, String char )构造方法会以第二个参数 char 给出
*的编码格式来解码字节数组 bytes ,然后返回解码后的字符串并赋给变量 b
*/
System.out.println(b);
String c = new String(b.getBytes("GBK"), "UTF-8");
System.out.println(c);
}
}
输出结果图 ->:
总结
编码格式最好以UTF-8为主
和外界的输入输出最好都用同一种编码