URLencode 特殊字符 转义 遇上的坑

简介:   在项目中遇到一个问题,在webveiw和原生之间进行传值的时候,出现了一些encode的小问题。看起来很简单的问题,实际上却存在不小的坑。   首先说一下目前项目的结构,在一个activity中,webview和原生之间有多种交互。

 

  在项目中遇到一个问题,在webveiw和原生之间进行传值的时候,出现了一些encode的小问题。看起来很简单的问题,实际上却存在不小的坑。

  首先说一下目前项目的结构,在一个activity中,webview和原生之间有多种交互。

  如图所示

在原生调用webview方法,这种协议已经非常常用了,直接调用loadJS();但是自定义协议这个过程,使用的拦截跳转的方式,按照预定的协议来解析数据,这里面就有一些情况,比如数据中出现了中文,webview会encode这部分内容,这就要求我们对拦截以后的内容进行decode。

见下方代码:

1   private String decodeUrl(String url) {
2             try {
3                 return URLDecoder.decode(url, "utf-8");
4             } catch (UnsupportedEncodingException e) {
5                 e.printStackTrace();
6             }
7             return "";
8         }

上面这段代码,看上去是很合理的,但是老司机们认真看看,这里面有坑。

首先看一下底层代码的decode。

   /**
     * @throws UnsupportedEncodingException if {@code     charsetName} is not supported.
     */
    public static String decode(String s, String charsetName) throws UnsupportedEncodingException {
        return UriCodec.decode(s, true, Charset.forName(charsetName), true);
    }

 

我想老司机们应该已经明白了是为啥了,就是检查异常和运行时异常的问题了。UnsupportedEncodingException 仅仅是检查时异常,而可能还有运行时异常,因此这里代码需要改为:

 1 private String decodeUrl(String url) {
 2             String decodeUrl = "";
 3             try {
 4                 decodeUrl = URLDecoder.decode(url, "utf-8");
 5             } catch (Exception e) {
 6                 e.printStackTrace();
 7             } finally {
 8                 return decodeUrl;
 9             }
10         }

 

这里对异常进行简单的介绍。

在 Java 中,所有的异常都继承了 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。
Throwable: 有两个重要的子类:Exception(异常)和 Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。
Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。

Exception(异常):是程序本身可以处理的异常。见图:

运行时异常很常见比如 空指针、非法参数、数组越界、类转换异常、算术异常等。这些异常需要老司机们有经验有技巧的对待,写代码时动用金手指,把这些异常都捕获住。

常见的比如:

1   String  numberStr= "1";
2 try{
3   int number = Integer.valueOf(numberStr);
4 } catch(exception e){
5 e.printStackTrace();
6 } 

上面代码没有检查时异常,但是需要老司机捕获住。

 

当然实际上这里面坑还不止这些,中文符号被decode还办好,关键是一些特殊符号不好办。

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。例如 空格的编码值是"%20"。
下表中列出了一些URL特殊符号及编码。

 

实际测试中发现,只要替换调%就好了。

替换代码为:

 1  private String decodeUrl(String url) {
 2             String decodeUrl = "";
 3             try {
 4                 String transformUrl = url.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
 5                 decodeUrl = URLDecoder.decode(transformUrl,"UTF-8");
 6             } catch (Exception e) {
 7                 e.printStackTrace();
 8             } finally {
 9                 LogUtil.e("my", "decodeUrl:" + decodeUrl);
10                 return decodeUrl;
11             }
12         }

 

以上代码,通过了表格8种符号 全半角形式以及日文韩文的测试,传值和decode都是正常的。

 

 

 

目录
相关文章
|
网络协议 安全 Unix
centos7.9系统部署NFS详细流程—2023.04
centos7.9系统部署NFS详细流程—2023.04
1681 0
|
搜索推荐 IDE 开发工具
IDEA自定义右键菜单
IDEA自定义右键菜单
3634 1
|
网络架构
udp的简单整理
udp的简单整理
1223 0
|
2月前
|
人工智能 JSON 运维
阿里云百炼 + Qwen3.7 实战:手把手构建一个支持工具调用的 AI Agent
本文记录使用阿里云百炼平台+Qwen3.7-Max构建企业级AI运维助手的全过程:依托其原生Function Calling、128K上下文与多工具并行调用能力,实现稳定、合规、低成本的Agent落地,含完整代码、踩坑解析与成本实测。
|
5月前
|
人工智能 数据可视化 机器人
Qclaw:你的本地龙虾管家,一键管理 OpenClaw
Qclaw是OpenClaw的图形化管理工具,专为新手设计:一键安装、拳击龙虾钳引导界面、分步可视化配置(模型/API/飞书钉钉/群策略/Skills等),支持定时任务、费用看板、记忆管理与人设加载,让小白轻松上手AI机器人。
2560 2
Qclaw:你的本地龙虾管家,一键管理 OpenClaw
安全 定位技术 API
4689 0
|
API 开发者 异构计算
实战 | Intel OpenVINO™ Day0 实现 Qwen3 快速部署
实战 | Intel OpenVINO™ Day0 实现 Qwen3 快速部署
1559 10
实战 | Intel OpenVINO™ Day0 实现 Qwen3 快速部署
|
数据采集 安全 API
使用开源项目和IP代理快速获取谷歌学术论文资源并通过大模型提炼信息
使用开源项目和IP代理快速获取谷歌学术论文资源并通过大模型提炼信息
|
XML API Android开发
自动点击精灵, 手机自动点击器,屏幕自动点击器
完整的Android自动点击器应用,包含了基础点击功能、多点触控和手势滑动等高级特性。如需进一步
|
消息中间件 数据采集 移动开发
数仓建模—埋点设计与管理
开始之前我们先看一下我们为什么要收集埋点数据,埋点都可以做什么,埋点主要用于记录用户行为,几乎是应用必不可少的功能.埋点的作用包括但不限于
1729 0
数仓建模—埋点设计与管理

热门文章

最新文章