计算机中存储的最小单元为1个字节,即8个bit(2的8次方),所以能表示的字符范围为0-255
- java中需要编码场景
- io中存在编码(若不指定编码则使用系统默认编码,跨环境使用时会出问题)
string file = “c/test.txt”;
string charset = “utf-8”;
//写字符转换为字节流
FileOutputStream outputStream = new FileOutputStream(file);
OutputStreamWrite writer = new OutputStreamWriter(outputStream,charset);
try{
writer.write(“****************”);
} finally{
write.close;
}
//读字节转化为字符
FileInputStream inputStream = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(inputStream,charset);
StringBuffer buffer = new StringBuffer();
Char buf = new Char(64);
int count = 0;
try{
while((count=reader.read(buf)!=-1){
buffer.append(buffer,0,count);
}
}finally{
reader.close();
}
2.内存中操作的编码
String s=“***********”;
byte[] b = s.getBytes(“UTF-8”);
String n = new String(b,”UTF-8”);
中文字符经过iso-8859-1编码会丢失成?,gb2312只支持6700个汉字,不是所有汉字都能用gb2312。gbk编码规则跟gb2312一样,只是支持汉字更多,gb2312能编译的汉字gbk同样支持,反之不然。utf-16特点是效率非常高,但是规则简单浪费存储空间。utf-8效率比gb2312,gbk高。
使用场景:utf-16效率非常高,从字符到字节的相互转换较简单,适合在本地磁盘和内存间使用,可进行字符和字节间的快速切换(如java内存编码就采用utf-16),但是不适合网络传输,因为网络传输容易损坏字节,一旦字节流损坏很难恢复
utf-8更适合网络传输,单个字符损坏不会影响后面字符,utf-8在编码效率及安全性上做了平衡,是理想的中文编码方式
- 对http请求过来的body参数的解码是在第一次调用request.getParamter时,request.getParamter被调用时会调用request.parseParamter进行解码,parseParamter会根据contenttype定义的charset进行解码(若未定义,则使用默认的iso-885),一定要在第一次调用request.getParamter之前就设置request.setCharacterEncoding(charset)
- 返回是通过response.setCharacterEncoding来设置,并且通过header的content-type返回给客户端,浏览器根据content-type的charset进行解码
- 访问数据库设置编码,如mysql: url="jdbc:mysql://localhost:3306/DB?userUnicode=true&characterEncoding=GBK"