web中的utf8问题

1 浏览器会根据content="text/html; charset=gbk"来解析该用什么编码来把这些字节流decode成字符串,并显示;
2 当客户端提交表单的时候,比如以post方式提交,浏览器同样会根据上面的编码,把这些字符串encode成字节流,发送到服务端;
3 在服务端,默认就会认为传过来的东西就是ASCii码,没别的,也就是ISO-8859-1,所以它就去decode,ISO-8859-1中根本没有中文汉字对应的二进制码,没找到,就乱了应该是一堆口吧;
4 解决办法是加一个过滤器,比如gbk,那就设置成request.setCharacterEncoding("GBK");这样服务端在获取字符串的时候,就用GBK去decode这个二进制流了;
5 如果是ajax,问题又来了,因为ajax只支持utf-8编码格式,过程应该是这样:
    1. 浏览器通过ajax像server端post数据时,ajax自动将浏览器中的文字用utf-8 encode成二进制流,然后发送到server端;
    2. server端如果配置的filter是gbk,那么会用gbk去decode这个二进制流,显然乱麻;但是不应该是一堆口,因为他应该根据二进制流的每两位字节,在GBK编码表中能找到对应的内容,具体的内容是简体文字还是繁体文字还是其他的,就不一定了;
        此时要是偶数个汉字还好(可以把它用gbk进行encode,然后用utf-8进行decode,这样就还原回来了),
        如果是奇数个汉字就出现丢失了(因为一个字符用UTF-8 encode后为3个字节,如果三个字符被encode之后,就是9个字节,当用gbk进行decode 的时候,gbk是用2个字节,结果剩下了一个字节,这个字节在gbk的编码表中不存在(因为gbk编码表都是2个字节的),所以就用?号填充了)。
    3. 所以必须在服务端的fiter中对ajax请求进行判断,用jquery为例:

$.ajax({
    
    contentType:
" application/x-www-form-urlencoded;charset=utf-8 " ,


在server端的filter中,可以判断charset是不是空,如果加上上面的代码,那么charset就是utf-8,代码如下:

if (request.getCharacterEncoding() == null) {
    request.setCharacterEncoding(this.encoding);//正常提交请求时候,charset是空的,也就是说request.getCharacterEncoding()是空的;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值