天天看点

Web技术----中文编码

计算机中存储的最小单元为1个字节,即8个bit(2的8次方),所以能表示的字符范围为0-255

  • java中需要编码场景
  1. 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"

继续阅读