字符集经验之谈

也许大家已经看惯了书上说的GBK是对GB2312的扩充,就是说,GB2312字符集中的所有字符都可以在GBK 字符集中找到。可是最近在一次调试Python爬虫的过程中就发现了一些字符的不同。同时大家也应该注意一些网页的默认编码字符集了。

当时正在分析的一个网页的默认编码字符集是GB2312,其中含有一个符号"·",这个常作为项目符号。在使用 GB2312进行解码时,得到的unicode字符是/u30fb,然后使用系统默认编码GBK进行打印时就提示了编码错误。即字符串"/xa1/ xa4"无法使用GB2312解码为unicode字符后再编码为GBK编码显示。(by gashero)实际测试中只要不会交换编码,那么使用同一种编码进行编码和解码就不会出问题。

后来查找得知,字符/u30fb是一种特殊的unicode字符,是一种不允许显示的字符,所以在GBK编码中就没有它的位置。而字符串"/xa1/xa4"使用GBK解码时得到的是/u00b7

至此得知,虽然网页的默认编码是GB2312,但是实际上使用的是GBK编码,也使用了一些在GB2312GBK之间不同的编码字符。所以也就导致了这个错误。

建议以后编程序的时候,遇到默认编码为GB2312的大可以直接使用GBK进行解码为unicode字符串。

----------------------------------------------------------------------------------------------------------------------------

以上是一份转载,它只说明了问题的一方面,以下以对字符集的理解,全面解析一下字符的问题,与大家分享一下!

1.在乱码显示为?

其主要原因是GBK——>Unicode——>ISO-8859-1,这个问题在java中十分容易发生。

 

2.Servlet/JSP中发生乱码

       要了解Servlet/JSP发生乱码的原因,就要先了解一下Web请求中响应过程中,中文字符编码的转换过程,如下:

(1)       浏览器发送GB2312编码的中文数据

(2)       Web容器内容使用ISO-8859-1编码将其转换为Unidcode,相当于new Stirng(buf,”ISO-8859 -1” )

(3)       Web容器调用request.getParamter得到String

(4)       a)如果没有知道输出字符集,则默认为ISO-8859-1输出,在浏览器上正常显示中文

b)如果特意指定输出字符集为GB2312则出错,显示??,主要由于没有意识到第2步的存在

 

3中文乱码的解决方案

(1)       post方法中提交中文字符

为了避免容器以ISO-8859-1编码,设置request.setCharacterEncoding(“GBK”);在向浏览器方送数据之前,调用response.setContentType(“text/html;charset=GBK”)response.setCharacterEncoding(“GBK”);,以指定输出内容的编码方式是GBK

 

(2)       GET方法提交的表单数据中有中文

这是在服务器端调用request.setCharacterEncoding(“GBK”);没有作用,需要

String  name = request.getParameter(“name”);

name = new String(name.getBytes(“ISO-8859 -1” ),”GBK”);

 

注意: 在服务器端遇到中文需要编码解码的话建议是使用GBK,不建议使用gb2312,(上文的建议相同,而且GBKgb2312完全,)因为gb2312在编译服务器端转换是会出现编码与解码不一致的错误

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值