java servlet乱码问题_Java编码和servlet乱码问题(1)-Java编码

在写这边文章时,在网上扒拉了很久,发现好多博客总结的都非常好,我也是参考了很多,在文章最后会列出一些觉得不错的博客地址,大家如果有兴趣可以去看看。

本篇主要是简单介绍Java编码知识,如果已经非常了解,可以手抖了,把宝贵时间用到看其他文章上面吧。

大家都知道中文需要编码后传输才不会有乱码,但是为什么要编码呢,因为计算机的一个最基本的存储单元byte无法表示一个中文字符,所以我们必须先把中文字符经过转换,转换成计算机能够表示的字符。当需要重新读取这些字符时,按照之前的转换规则,再转换回来就可以了。

这里的转换规则就是我们的所说的编码方式了,常见的有ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16等。首先我们的字符在jvm都是Unicode编码,而上面的那些编码方式就是在传输时或显示时用什么样的编码方式。比如你把字符串以UTF-8编码方式转换成Unicode编码存储,然后等再次读取的时候还是采用UTF-8编码方式来反编码,就能获取到正确的字符。因为Unicode编码采用了世界统一的码表进行编码,因此相同的字符对应不同的系统或环境对应的Unicode码是一样的。

比如一个字符串“中国”,他的Unicode码是一定的,如果通过getBytes("GBK")方法,其中的内部逻辑就是首先“中国”的Unicode码转换成GBK编码,然后用GBK编码后的数据进行传递。当对方拿到这个字节数组以后,通过new String(recBytes,"GBK"),就能把获取到的GBK编码的字节数组用GBK编码重组后再转换成Unicode编码来存储或显示。但是对于GBK.GB2312,UTF-8等这些双字节编码而言,对中文进行编码、转码完全没有问题,只有前后的编码格式一样就可以,而ISO-8859-1这些单字节编码就不行了,因为是单字节,所以能表示的字符范围是0-255,只能对英文字符、数字等表示。比如对于“中国”,用上面的getBytes("ISO-8859-1"),这时你将得到3f,3f(3f表示?),因为ISO-8859-1没有“中国”的对应字符集,所以只好以?来表示了

15.gif

最后要说的是,实际上我们可能会跟各个渠道或设备打交道,比如浏览器、数据库、文件等,在进行转码或存储的时候,最好都指定一个固定的字符集,然后统一进行转换,就不会遇到乱码的问题。对于web项目可能遇到乱码的几率比较大,这个问题会在下一篇文章中集中分析一下。下面附上一些觉得不错的文章,不想看本文的可以直接猛击下面链接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值