一.问题描述
WebView调用JS传递字符串时好时坏,可以发现当字符串中含有一些特殊符号和转义符时就会出现异常,控制台报错:
String script = String.format("javascript:setCode('%1$s')", content);
webView.evaluateJavascript(script, null);
Uncaught SyntaxError: Invalid or unexpected token
原因在于使用evaluateJavascript来调用js函数时,不会对字符串进行编码处理的而是直接传过去。
二.解决方案
既然知道了是特殊符号和转义符引起的问题,那处理好这些符号就好了,首先看网上常见的处理法案,是对这些符号进行预先处理
params.replace("'", "\\'")
.replace("\"", "\\\"")
.replace("\n", "\\n");
实际在使用这种方法会发现原本要显示'\n'字符串却变成了换行,效果并不好。所以最佳方法应该是采用URLEncoder编码字符串参数后传递
content = URLEncoder.encode(content, "UTF-8").replaceAll("\\+", "%20");
String script = String.format("javascript:setCode('%1$s')", content);
webView.evaluateJavascript(script, null);
这里要注意URLEncoder会将空格符号变成'+'字符,所以编码后要替换一下,这不会影响原来的'+'字符,然后在JS代码中将字符串解码即可
content= decodeURIComponent(content)