JAVA程序运行时使用的是unicode编码,unicode编码是模型,其具体表现形式有utf-8,utf-16,utf-32等。
utf-16对普通字符和汉字都是用2个字节。
utf-32每个字符使用的都是3个字节进行编码,是定长的。
utf-8使用的是变长编码,英文字符使用的是一个字节编码,byte的内容和ASCII是相同的。
中文是3个字节
base64并不能认为是字符的编码,可以认为是一种加密方式。常常用于对字节进行编码,对3字节编码会形成4字节的结果。BASE64加密简单粗暴。
下面的测试说明:对文件进行读取和写以及string的转换如果不显示的指定字符编码,默认使用的是操作系统的编码
package com.ydd.http; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.util.Arrays; /** * 对文件进行读取和写以及string的转换如果不显示的指定字符编码,默认使用的是操作系统的编码 * @author yunzhu.ydd * */ public class CharsetTest { public static void main(String[] args) throws UnsupportedEncodingException { String oldString="你好!"; System.out.println(Arrays.toString("你好".getBytes())+"|"+Arrays.toString("你好".getBytes("utf-8"))+"|"+Arrays.toString("你好".getBytes("gbk"))+"|"+Charset.defaultCharset().displayName()); } }
运行结果如下(string.getBytes(void)默认是根据操作系统的编码生成byte数组):
[-60, -29, -70, -61]|[-28, -67, -96, -27, -91, -67]|[-60, -29, -70, -61]|GBK
虽然ISO-8859-1(一个字节)编码格式不能表示中文,但是也能将中文转换成ISO-8859-1格式,只是转换之后会丢数据,是乱码。转换也不会抛异常。