总共有128个,用一个字节的低七位表示,0~31是控制字符如换行、回车、删除等,32~126是打印字符。
扩展了ASCII码,但仍然是单字节编码,总共能表示256个字符。
全称《信息技术 中文编码字符集》,是双字节编码。总的编码范围是A1~A7,其中A1~A9是符号区,总共包含682个符号;B0~F7是汉字区,包含6763个汉字。
全称《汉字内码扩展规范》。扩展了GB2312, 它的编码范围是8140~FEFE(去掉XX7F), 总共有23940个码位,能表示21003个汉字。它的编码是和GB2312兼容的。
UTF-16具体定义了Unicode字符在计算机中的存取方法。UTF-16用两个字节表示Unicode的转化格式,它采用定长的表示方法,即不论什么字符都可以用两个字符表示。Java使用UTF-16作为内存的字符存储格式。
UTF-16统一采用两个字节来表示一个字符,虽然简单方便,但会造成空间浪费。UTF-8采用变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1~6个字节组成。
UTF-8编码规则:
I/O操作中存在编码
Reader和Writer是字符流,InputStream和OutputStream是字节流。而InputStreamReader和OutputStreamWriter是关联字节到字符的桥梁。
内存操作中存在编码
Java中提供了Charset类,该类中的encode()和decode()方法分别对应char[]到byte[]的编码和byte[]到char[]的编码:
Charset charset = Charset.forName("UTF-8");
ByteBuffer byteBuffer = charset.encode(string);
CharBuffer charBuffer = charset.decode(byteBuffer);
Java中还提供了ByteBuffer类,该类可以实现char到byte的软转换,它的转换不需要编码和解码,只是把一个16bit的char拆分成了2个8bit的byte。它们的实际值没有被修改,仅仅是数据类型做了转换。