Unicode Replacement with ASCII

近一段时间在处理 js 内容返回的 innerHTML 字符串时,通过 Android webview 调用的 js 接口返回的字符串外部会主动添加双引号【”】,例如:”Hello”,当然这只是其中一个比较奇怪的点,另外一个奇怪的点就是左尖括号【<】总是返回 unicode 值,如下

例如:”\u003Cp>考虑\u003Cspan style=\”color: rgb(197, 197, 48);\”>急急急看看看看\u003C/span>\u003C/p>”

但是右边的尖括号不会出现此种情况,查了一圈相关的点暂时没找到相关的解释,耗费了不少的时间,使用了例如 decodeuricomponent 等没有达到想要的效果。

因此只能退而求其次,换另外一种思考方式能不能把这些 unicode值转成对应的字符,并且为了尽量考虑多种情况,使用通用正则式来处理,当然此问题得后续跟进

Pattern p = Pattern.compile("\\\\u(\\p{XDigit}{4})");
Matcher m = p.matcher(value);
StringBuffer buf = new StringBuffer(value.length());
while (m.find()) {
String ch = String.valueOf((char) Integer.parseInt(m.group(1), 16));
m.appendReplacement(buf, Matcher.quoteReplacement(ch));
}
m.appendTail(buf);
value = buf.toString();

其中一个比较重要的点就是替换字符串中的 \u ,因为两者都是 java 语言中的转译字符,因此需要 \\ 代替 \, \\u 代替 \u,因此在真正书写的时候 u 前面有四个 \

Because Java string literals use \ to introduce escapes, the sequence \\ is used to represent \. Also, the Java regex syntax treats the sequence \u specially (to represent a Unicode escape). So the \ has to be escaped again, with an additonal \\. So, in the pattern, "\\\\u" really means, “match \u in the input.”

转自:https://stackoverflow.com/questions/24215063/unicode-replacement-with-ascii

安卓 5.1 WebView loadData 乱码

很久以前就有用户反馈网页加载自定义网页内容时唯独标题和底部的 tag出现乱码,当时一是没有稳定再现环境,二是没有这方面的经验,只是按照自己想法针对性做了一些修复,但是还是有用户有类似反馈

在适配安卓10的过程中,发现必须要对自定义网页内容进行 base64 的 encode,否者加载不出来,加之之前在测试安卓 5.1 模拟器的时候发现使用 webview 加载自定义网页内容 100% 会出现标题乱码,但是内容不会乱码。

经过多种尝试,包括把文本正文内容和标题放在一起,不包括英文字符,从 xml 读取等等操作,均发现还是会出现乱码,最后找到一篇以前的解决方法,需要在 loadData 的 mimeType 里面添加编码格式

String newhtml_code = Base64.encodeToString(text.getBytes(), Base64.NO_PADDING);
webView.loadData(newhtml_code, "text/html; charset=UTF-8", "base64");

困扰很久的问题终于解决,有些当时用户反馈可能觉得奇葩的问题,可能会一直困扰用户,作为开发者对于这些不能再现问题一定得留有耐心,且细心,温故而知新,老问题说不定就能够定位和解决