JavaWeb中乱码问题

来源:互联网 发布:网络上个人信息 编辑:程序博客网 时间:2024/05/22 22:12

编码问题主要由于编码类型和解码类型不一致所以出现乱码,关键是理解web访问整个流程中每步使用的编码。首先介绍一下常用编码。

编码

utf-8编码

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。
如表:

1字节 0xxxxxxx2字节 110xxxxx 10xxxxxx3字节 1110xxxx 10xxxxxx 10xxxxxx4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

ISO-8859-1编码

ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。这个格式下没有中文编码,中文会乱码变成,很明显,iso8859-1编码最多能表示的字符范围是0-255,表示的字符范围很窄,无法表示中文字符。

URL编码

将针对- _.~四个字符之外的所有非字母数字字符的字节码进行百分号编码。在Java和PHP当中,由于历史原因,导致在进行URLEncode的时候,会将空格编码为+,而不是编码为十六进制编码%20
java中提供了URL编码的API,URLEncoder.encodeURLDecoder.decode

String s = "getname 123=中";String sencoder = URLEncoder.encode(s, "utf-8");//编码后sencoder的值为getname+123%3D%E4%B8%AD

这里要注意,在web表单提交的数据中,只对value值这一项进行url编码,而且是浏览器自动进行,浏览器会按照页面当前编码将value字符翻译为字节码,然后对字节码进行百分号编码

转换编码

String(byte[] bytes, String encoding) // 指定一个字节数组的编码方式

encoding所指的是bytes中的数据是按照那种方式编码的,也就是让系统把bytes中的字节数据按照指定的encoding编码格式编码。如果不指明,bytes的编码方式将由jdk根据操作系统决定。

byte[] bytes = "中文".getBytes("utf-8";//将一个字符串,以utf-8编码形式解码为字节数组

关于Tomcat服务器编码问题

tomcat服务器默认设置的编码格式使ISO8859-1的编码格式,涉及编码的方法有

// 请求数据编码request.setCharacterEncoding("utf-8");          // 设置请求数据的编码格式,只对Post数据有效,                                                //相当于tomcat内部自动对接收的数据做了一次URLDecoder.decode(queryString,"utf-8");request.getParameter("name");                   // 获取请求参数,可以获取Post与getString queryString = request.getQueryString();  // 获取get提交的原始数据,需要进行url解码
// 响应数据编码response.setCharacterEncoding("GBK");           // 设置响应数据的编码,主要是针对写出的字符数据

例如:

PrintWriter out = response.getWriter();out.write(new String("你好".getBytes("GBK"),"iso-8859-1"));out.write("你好");out.write("abc");

由于默认tomcat使用的是ISO-8859-1进行编码的,所以当不指定返回数据编码格式时,默认就会使用ISO-8859-1进行编码,所以结果为:

你好??abc

当设置了相应数据编码,则会使用相应数据编码格式进行解码,GBK编码就不会出现乱码

响应数据编码

response.setContentType("text/xml;charset=utf-8");

或者

response.setCharacterEncoding("utf-8");

另一篇关于Servlet乱码

原创粉丝点击