JavaWeb中乱码问题

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

编码

utf-8编码

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

1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 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与get
String 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乱码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值