webview中文乱码及cookie的设置

标签: geek | 发表时间:2017-06-18 00:00 | 作者:
出处:http://itindex.net/relian

这里主要记录关于 WebView加载含中文的 urlcookie中设置中文显示乱码的解决方法。

目前,在android 开发中,为了方便程序进行扩展,很多 APP中都采用了 WebView来加载 H5 页面,这样通过后台更换一个H5地址,程序中就有相应的变化,不用重新打包发布。我参与的项目中,使用 WebView的场景主要有下面几种:商城类APP中的商品详情、签到、帮助中心、积分抽奖、邀请好友,banner详情等。

一、简单使用

在布局文件中添加 WebView控件,然后在 Activity总绑定控件,进行相关设置,部分代码如下;

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
      
mWebView = (WebView) findViewById (R.id.wv);
WebSettings webSettings = mWebView.getSettings();
/*支持JavaScript*/
webSettings.setJavaScriptEnabled (true);
/*支持缩放*/
webSettings.setSupportZoom (true);
/*启用内置缩放装置*/
webSettings.setBuiltInZoomControls (true);
/*设置不缓存*/
webSettings.setCacheMode (WebSettings.LOAD_NO_CACHE);
/*设置加载网页的url*/
mWebView.loadUrl ("http://192.168.0.101/WebViewDemo/index.html");

如果希望网页中的连接仍然是用 WebView打开,需要进行如下设置:

      
1
2
3
4
5
6
7
8
9
10
      
mWebView.setWebViewClient (new WebViewClient()
{
@Override
public boolean shouldOverrideUrlLoading (WebView view, String url)
{
/*拦截网页中的链接,使其在WebView 中打开*/
view.loadUrl (url);
return true;
}
});

如果打开多个网页,以免按返回键结束当前 Activity,需要监听返回键,具体有如下两种做法:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
      
/*方法一*/
mWebView.setOnKeyListener (new View.OnKeyListener()
{
@Override
public boolean onKey (View v, int keyCode, KeyEvent event)
{
if (event.getAction() == KeyEvent.ACTION_DOWN)
{
if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack() )
{
/*后退*/
mWebView.goBack();
return true;
}
}
return false;
}
});
/*方法二*/
@Override
public boolean onKeyDown (int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (mWebView.canGoBack() )
{
/*后退*/
mWebView.goBack();
return true;
}
}
return super.onKeyDown (keyCode, event);
}

二、加载含中文url乱码

由于加载的网也上需要相关数据,所以后台返回时将其拼接在url中,然后在 H5页面中用js获取。如下样式的url,其中shopName 的值为中文,导致加载该页面时显示一直为乱码。

       
1
       
http://192.168.0.101/WebViewDemo/index.html?shopName=免单购平台&cell=123456789&qq=2360633699

由于url的限制,对于中文必须转码后可以使用。这里便将中文部分转码后使用,将中文转成 unicode,并将其中的 \换成 %,具体做法如下:

       
1
2
3
4
5
6
7
8
9
10
       
private String cnToUnicode (String cn)
{
char[] chars = cn.toCharArray();
String resultStr = "";
for (int i = 0; i < chars.length; i++)
{
resultStr += "%u" + Integer.toString (chars[i], 16);
}
return resultStr;
}

使用方法可以将 上述 url中shopName 对应的值 “免单购平台” 转为如下:

       
1
       
%u514d%u5355%u591f%u5e73%u53f0

将替换出现的中文,即可解决乱码问题。可以通过后台进行处理。然而这种做法,在 android端可以,浏览器也可以,导致 ios端无法显示网页,最终放弃,换用 cookie的方式。

关于更多url的资料,可以查看阮一峰的 关于URL编码这篇文章。

三、设置cookie 乱码

由于之前的项目在使用 H5 时,不管 android 还是 ios 都有用过cookie 来传递参数,于是我们换用中这种方式。然而,发现给cookie中设置的中文,在android 上会出现乱码,ios则不会。之前的用法中没有在cookie 中设置中文,便尝试了各种编码,最终使用 URLEncoder 的 encode() 发发进行编码
如下是设置 cookie 的相关代码:

      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
      
/**
* 设置 cookie
* @param url
*/
private void setCookie(String url) {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
try {
/*对中文编码*/
cookieManager.setCookie(url, "shopName=" + URLEncoder.encode(shopName, "utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
cookieManager.setCookie(url, "cell=" + cell);
cookieManager.setCookie(url, "qq=" + qq);
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.getInstance().sync();
} else {
CookieManager.getInstance().flush();
}
}
@Override
protected void onDestroy() {
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.removeSessionCookie();
if (Build.VERSION.SDK_INT < 21) {
CookieSyncManager.getInstance().sync();
} else {
CookieManager.getInstance().flush();
}
super.onDestroy();
}

注:需要在设置 webview 之前调用 setCookie()方法。

最后只要在 H5 页面中使用js来获取即可。

此外,对于 WebView ,可以加载本地 html文件,可以加载 html 标签 ,可以与js互相调用等。

       
1
2
       
/*加载部分片段*/
mWebView .loadDataWithBaseURL("",data,"text/html","utf-8","");

美团关于 webview 的文章:
WebView性能、体验分析与优化

相关 [webview 中文乱码 cookie] 推荐:

webview中文乱码及cookie的设置

- - IT瘾-geek
这里主要记录关于 WebView加载含中文的 url和 cookie中设置中文显示乱码的解决方法. 目前,在android 开发中,为了方便程序进行扩展,很多 APP中都采用了 WebView来加载 H5 页面,这样通过后台更换一个H5地址,程序中就有相应的变化,不用重新打包发布. 我参与的项目中,使用 WebView的场景主要有下面几种:商城类APP中的商品详情、签到、帮助中心、积分抽奖、邀请好友,banner详情等.

android WebView登录状态session id 和cookie同步

- - 移动开发 - ITeye博客
android客户端通过httpClient或者httpUrlConnection进行登录后,为了把登录状态同步到webView中,这时需要进行cookie的同步.         nvPairs.add(new BasicNameValuePair("gender", "男"));.

WebView JS 交互

- - ITeye博客
WebView加jquery做页面会怎么样呢. // 创建WebView对象. // 把programList添加到js的全局对象window中,. // 这样就可以使用window.programList来获取数据. * 定义js回调java函数. // 绑定键盘的向上,向下按钮事件触发相应的js事件.

Android WebView 用法

- - 移动开发 - ITeye博客
Android和iOS系统都提供了标准的浏览器控件,在Android中是WebView,iOS中为UIWebView. 在iOS中你实例化一 个UIWebView即可调用loadRequest来加载一个网页,但是在Android中你不仅需要创建一个WebView,还需要做一些其他的事 情,建议初次使用WebView的读者按照以下步骤使用:.

细说Cookie

- ~Wing~ - 博客园-首页原创精华区
Cookie虽然是个很简单的东西,但它又是WEB开发中一个很重要的客户端数据来源,而且它可以实现扩展性很好的会话状态, 所以我认为每个WEB开发人员都有必要对它有个清晰的认识. 本文将对Cookie这个话题做一个全面的描述, 也算是本人对Cookie的认识总结. Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递.

LTPA Cookie原理

- - Web前端 - ITeye博客
Lightweight Third-Party Authentication (LTPA)是IBM Websphere和Domino产品中使用单点登录技术. 当服务器配置好LTPA认证方式,用户通过浏览器成功登录后,服务器会自动发送一个session cookie给浏览器;此cookie中包含一个LTPA Token.

WebView使用总结

- - ITeye博客
        以下是使用WebView过程中的部分场景和解决方案. 如果WebView是放在TabHost中的Activity, 而且WebView中包含html的select,会在点击其中的Item时候崩溃,异常信息如下: android.view.WindowManager$BadTokenException: Unable to add window.

session和cookie详解

- - ITeye博客
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一 技术. 本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答. 二、HTTP协议与状态保持.

Cookie深度解析

- - CSDN博客互联网推荐文章
       最近在公司做了Web端单点登录(SSO)功能,基于Cookie实现,做完之后感觉有必要总结一下,本文着重讲解Cookie,下文会说明单点登录的实现方案.        众所周知,Web协议(也就是HTTP)是一个无状态的协议. 一个Web应用由很多个Web页面组成,每个页面都有唯一的URL来定义.

Android WebView的坑总结

- - CSDN博客推荐文章
       最近把做好的iPad HybridApp向Android迁移,碰到的坑太多了,让我这个折腾过Android接近4年的老鸟都头疼. 现在把前人遇到的都列出来,再慢慢解决自己的,目前已经解决了android键盘覆盖问题,下面最棘手的问题就是屏幕高度的适配问题了. 1、 Andrid4.1事件穿透BUG 原因不明.