java中的编码

一.在I/O中存在的编码

  1.读,Reader,InputStream,InputStreamReader。

    Reader是读字符的父类,InputStream是读字节的父类,InputStreamReader是读取字节到字符的桥梁,它是委托StreamDecoder去做的。

  2.写,Writer,OutputStream,OutPutStreamWriter。

    Writer是写字符的父类,OutputStream是写字节的父类,OutputStreamWriter是写字符到字节的桥梁,它是委托StreamEncoder去做的,它负责将字符编码为字节。

二.内存操作中的编码

  1.String进行字节与字符的转换

    字符到字节:byte [] b = s.getBytes("UTF-8");

    字节到字符:String n = new String(b,"UTF-8");

  

   2.用Charset进行转换

    Charset charset = Charset.forName("UTF-8");//设置编码

    ByteBuffer byteBuffer = charset.encode(string);//char 到 byte

    CharBuffer charBuffer= charset.decode(byteBuffer );//byte 到 char

三.JavaWeb中的编码

   1.url中的编码

    uri:一般浏览器对PathInfo和QueryString的编码是不一样的,Tomcat在接收这个URL再转成char是在org.apache.catalina.connector.ConyoteAdapter的convertURI的方法里面完成的,如果没有设置默认是ISO-8859-1编码,所以有中文URL最好把URIEncoding设置为UTF-8.

    QueryString:GET方法的HTTP请求的QueryString和POST方法提交的表单参数都是以Parameters保存的,解码会调用parseParaments。QueryStringd的解码字符集要么是Header的ContentType定义的Charset,要么是默认的ISO...,所以服务器最好设置<Connector/>中的URIEncodeing为UTF-8和useBodyEncodingForURI设置为true(为true的话就会使用请求头里面的ContentType设置的编码字符集)

   2.HTTP Header

    对Header进行解码是调用request.getHeader时进行的,我们无法设置Header的其他解码方式,它默认是ISO的,如果Header里面有非ASCII字符,肯定会乱码。

   3.POST表单的编解码

    POST表单传输是通HTTP的BODY传递到服务端的,当在页面点击提交按钮时,浏览器先根据ContentType 的Charset对表单的参数进行编码,然后提交到服务端,服务端第一次调用request.getParamenter来解码的,我们可以通过requset.setCharacterEncoding(charset)进行设置。不过需要注意的是这个方法要用在request.getParamenter之前,Tomcat在解析Parameter参数集合时会先获取Header的content-type,但是默认情况下,浏览器在提交from表单时,content-type没有charset信息。如果没有进行设置,那么表单提交的数据将会根据系统默认的编码。

   4.HTTP BODY的编解码

    在服务器通过Response返回数据给浏览器,要先通过response.setCharacterEncoding来设置,它会通过Header的Content-Type返回给客户端,浏览器接收到返回的Socket流时通过Content-Type的charset来解码,如果没有设置Content-Type的charset,那么浏览器将会根据HTML的<meta />里面的charset进行解码,没有定义的话就默认

  

   

猜你喜欢

转载自www.cnblogs.com/JimmyFanHome/p/9925175.html