Android中一个webkit处理汉字编码的问题

在XX项目中解决android webkit处理汉字编码问题的总结html

问题:java

服务器经过302重定向方式发送给客户端重定向地址,地址中的汉字采用原数据方式发送,没有通过任何编码。由于其中存在汉字,因此在android端通过webkit解码编码以后,最终没法正常在服务器端请求正确数据。Android中默认使用utf-8编码。android

 

Android在framework中解析http信息,Request.java的函数readResponse经过AndroidHttpClientConnection.java的函数parseResponseHeader解析response的header部分。程序员

存储数据使用的是org.apache.http.util.CharArrayBuffer中的CharArrayBuffer。使用SessionInputBuffer的readline来读取一行,进行解析。web

咱们主要关心的是Location部分,由于重定向主要是经过Location的值从新去请求url。Android中也是这么作的,不会去html的body中解析标记A的herf。apache

读取的每一行都会被传入到Headers.java中进行解析。Location地址被转换为String存储到mHeaders[IDX_LOCATION]中。数组

在从CharArrayBuffer变成String的时候,有个值得注意的地方,经过String的源码能够看到,若是使用char[]的方式传入给String构造参数,String中不会再次编码(encode),而使用byte[]方式传入的话,会通过编码转化之后存储到String的value中。默认编码方式是utf-8.服务器

咱们这里的CharArrayBuffer里面为char[]方式,因此直接存储,不会通过编码。微信

 

Android会将获得的Location地址存储在Header的String数组中。网络

Request.java的函数readResponse会在最后调用LoadListener的endData结束解析。

在endData中通过一系列的消息转发以后最终走到doRedirect中,从字面意思也能看出来是重定向。从以前存储的Header中取出Location,而后调用native接口将url传送到webcore jni中调用底层进行url解析。将从新解析过的url返回到java层,最后进行http请求。

问题出在jni中进行解析部分。WebCoreResourceLoader的RedirectedToUrl拿到url后会构造KURL对象,KURL在构造函数中通过init,会进行相应的编码,默认编码方式为utf-8。因此汉字的元数据通过此次编码后变为utf-8编码。返回到java部分进行http请求,因此在抓包中出现的%C2%BA%C3%BA%C3%91%C3%A5%C2%B1%C3%B3是“胡彦斌”的元数据0xba, 0xfa,0xd1, 0xe5, 0xb1, 0xf3通过utf-8编码后的结果。

 

服务器默认的编码应该是gb2312。因此咱们发送给服务器后,服务器将按照gb2312去解析,因此就会出现乱码:潞煤�氓卤贸

 

修改方法

对整个已经通过utf-8编码的url进行utf-8解码。在KURL中有现成的解码函数,默认解码方式为utf-8.:decodeURLEscapeSequences(String)

 

基于android4.0

注:webkit中的网络模块为libcurl,android中使用的是本身的网络模块,framework中。


技术人员都有本身的情怀,深陷其中而不被理解,欢迎关注我的微信公众平台:程序员互动联盟(coder_online),一个开发人员的家,来诉说本身的故事。

相关文章
相关标签/搜索