在 Cordova/Phonegap for Android 中包含中文文件名的页面
本贴首发于:
http://xuekaiyuan.com/forum.php?mod=viewthread&tid=14


将中文文件名重命名为 jarsigner 程序支持的文件名

将文件名按 UTF-8 编码进行 URL 编码。

$encodename = urlencode(iconv('GB2312','UTF-8',$filename));

判断是否和原来的文件名相同

if ($encodename !== $filename) {

如果不相同则重命名

rename($argv[1] . DIRECTORY_SEPARATOR . $filename, $argv[1] . DIRECTORY_SEPARATOR . $encodename);

完整 rename.php 源代码如下

    <?php
foreach(scandir($argv[1]) as $filename) {
$encodename = urlencode(iconv('GB2312','UTF-8',$filename));
if ($encodename !== $filename) {
rename($argv[1] . DIRECTORY_SEPARATOR . $filename, $argv[1] . DIRECTORY_SEPARATOR . $encodename);
echo 'rename ' . $filename . ' to ' . $encodename . "\n";
}
}
?>

在程序中将请求还原成相应的文件名
确定需要判断的路径

String urlprefix = "file:///android_asset/www/";

判断当前请求是否属于该路径

if (url.startsWith(urlprefix)) {

属于该路径时,判断当前请求是否包含参数

if (url.contains("?") || url.contains("#")) {

获取文件路径

String relativePath = "www/" + url.substring(urlprefix.length());

尝试按路径打开文件

stream = cordova.getActivity().getAssets().open(relativePath);

不能打开文件时,返回异常信息作为文件内容

    StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter, true);
e.printStackTrace(printWriter);
byte[] bytes = new byte[0];
try {
bytes = stringWriter.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e2) {
e2.printStackTrace();
}
stream = new ByteArrayInputStream(bytes);

获取文件的 MIME 类型

String mimetype = FileHelper.getMimeType(url, cordova);

返回该文件

return new WebResourceResponse(mimetype, "UTF-8", stream);

完整 UrlFilter.java 源代码如下

    public WebResourceResponse shouldInterceptRequest(String url) {
String urlprefix = "file:///android_asset/www/";
if (url.startsWith(urlprefix)) {
if (url.contains("?") || url.contains("#")) {
return super.shouldInterceptRequest(url);
} else {
String relativePath = "www/" + url.substring(urlprefix.length());
InputStream stream;
try {
stream = cordova.getActivity().getAssets().open(relativePath);
} catch (IOException e) {
StringWriter stringWriter = new StringWriter();
PrintWriter printWriter = new PrintWriter(stringWriter, true);
e.printStackTrace(printWriter);
byte[] bytes = new byte[0];
try {
bytes = stringWriter.toString().getBytes("UTF-8");
} catch (UnsupportedEncodingException e2) {
e2.printStackTrace();
}
stream = new ByteArrayInputStream(bytes);
}
String mimetype = FileHelper.getMimeType(url, cordova);
return new WebResourceResponse(mimetype, "UTF-8", stream);
}
} else {
return super.shouldInterceptRequest(url);
}
}

在虚拟机中的效果如图所示

在 Cordova/Phonegap for Android 中包含中文文件名的页面的更多相关文章

  1. 在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序

    在 Linux 中自动生成 Cordova/Phonegap for Android 的 APK 安装程序 本贴首发于: http://xuekaiyuan.com/forum.php?mod=vie ...

  2. 使用 Cordova(PhoneGap)构建Android程序

    移动终端开发随着智能手机的普及变得越来越热,什么项目都想移动一把,但反观要去学这些各个终端的控件使用,实属不易,又特别是每个终端的控件及所用语言都各不相同,使得这种学习变得更加困难. 有没有一种简单的 ...

  3. 【JS】中ajax的URL中包含中文,后台接收乱码

    [问题]ajax提交get请求,url中参数包含中文,后台接收到显示乱码. [解决方案]前台: function getSiteInfoByName(siteName){ var res; $.aja ...

  4. 【性能测试】:LR中解决接口请求中包含中文字符,服务器不识别的问题

    在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...

  5. LR中解决接口请求中包含中文字符,服务器不识别的问题

    在LR中,直接写的接口请求,如果请求字段包含中文字段,服务器会不识别,这个时候就要用到lr_convert_string_encoding这个函数: 具体用法: lr_convert_string_e ...

  6. Dynamics CRM 通过OData查询数据URI中包含中文的情况

    filter条件如下"?$filter=new_name eq '采购主管' and new_entityname eq 'new_purchaseenquiry' ",如果用这个 ...

  7. Cocos2dx 代码中包含中文导致编译错误的问题解决方法

    从网上下载一个cocos2dx的源码,是IOS版本的,我将其迁移到windows 7下 ,用VS2010编译,出现一堆的C2001错误: 1>d:\cocos2d-x-2.2.6\mygame\ ...

  8. java web中请求和响应中包含中文出现乱码解析

    说明:在计算机中保存的一切文本信息是以一定的编码表(0,1,0,1)来保存我们所认识的字符(汉字或英文字符),由字符到计算机存储的二进制过程是编码,由读取二进制到文本的过程称为解码.而字符编码有多种不 ...

  9. Android中使用ViewPager实现屏幕页面切换和页面切换效果

    之前关于如何实现屏幕页面切换,写过一篇博文<Android中使用ViewFlipper实现屏幕切换>,相比ViewFlipper,ViewPager更适用复杂的视图切换,而且Viewpag ...

随机推荐

  1. Delphi三层网络架构代码实现

    Delphi三层网络架构代码实现 1 .三层网络的概念 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为: 表现层(UI).业务逻辑层(BLL).数据访 ...

  2. sax(用于处理XML事件驱动的推模型)解析例子

    SAX解析 Java程序如下: import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.SAXParser; impor ...

  3. FlexiGrid使用手册

    FlexiGrid使用手册 一.概览 Flexigrid是一个基于jQuery开发的Grid,与 Ext Gird类似.Flexigrid显示的数据能够通过Ajax获取或者从一个普通的表格转换. 它的 ...

  4. linux有用技巧:使用快照制作虚拟机

    在日常的学习其中,假设遇到了集群和负载均衡类的实验,须要用到大量的虚拟机,假设一个一个的去创建,显然是很费力和低效的.所以今天交给大家怎样用快照来制作虚拟机.想要多少给你多少^_^.仅仅要内存够用! ...

  5. 通过改变viewport 实现网站自适应

    var phoneWidth = parseInt(window.screen.width); var phoneScale = phoneWidth/640; var userAgent = nav ...

  6. 读书笔记—CLR via C#反射

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  7. 使用response实现文件下载功能

    response.setContentType("text/html;charset=utf-8");  response.setCharacterEncoding("u ...

  8. centos 4.4配置使用 and Nutch搜索引擎(第1期)_ Nutch简介及安装

    centos 4.4配置使用 1.Nutch简介 Nutch是一个由Java实现的,开放源代码(open-source)的web搜索引擎.主要用于收集网页数据,然后对其进行分析,建立索引,以提供相应的 ...

  9. [翻译]HBase 的 MVCC 和内建的原子操作

    翻译一篇:HBase MVCC and built-in Atomic Operations 作者:Lars Hofhansl HBase 有一些特殊的原子操作: checkAndPut, check ...

  10. vim实用笔记

    vim实用笔记   真是不知不觉过了一年,前段时间忙着考试什么的,没再写笔记写博客,考完又懒懒地玩了几天.这几天其实都在读别人的博客,感受一下大神的工作和生活感悟,感受一下过来人的经历和经验,对自己总 ...