问题描述
场景是 Android 与 H5 交互,将 Bitmap 格式图片转为 Base64 格式后通过调用 H5 的方法将数据传递给 H5,因为还包含其他信息,所以传递的参数是一个 Json 字符串,在通过 Gson 将我的对象转为 JsonObject 后,我发现 Base64 字符串增加了多了很多换行符,并将等号转义成了 '\u003d',导致前端不能成功地渲染出图片。
解决方法
-
解决增加换行符的问题
我使用的是
android.util.Base64.encodeToString(input, Base64.DEFAULT)方法将 Bitmap 转换为 Base64 字符串的,在这个工具中,转化后的 Base64 字符串每76个字符便会进行换行操作,由于在 Androidstudio 中换行符可以正确地 decode,所以不会出现问题,而其它平台可能无法对其进行正确地 decode 操作导致 Base64 不能还原,所以我们与其它平台对接时需按照下面的方式进行操作:android.util.Base64.encodeToString(input, Base64.NO_WRAP);可以看到第二个参数由
DEFAULT变为了NO_WRAP,下面是第二个参数代表的含义:flags 含义 DEFAULT 默认模式 CRLF 指示行的编码器标志位用 CRLF 替代 LF NO_CLOSE 传递给 Base64OutputStream 标记以指示它本身关闭时不应关闭它正在包装的输出流 NO_PADDING 省略末尾填充的 ’=' 字符 NO_WRAP 省略所有的终止符 URL_SAFE URL 和文件名安全方式,替换其中不符合 url 安全的字符如 + 和 / 一般情况下,我们使用
android.util.Base64进行转换时,只要 encode 和 decode 的 flag 相同,即可正确转换,但当与其它平台对接是,推荐使用NO_WRAP。 -
解决 '=' 被转义的问题
在转 Json 时我的操作如下:
val gson = Gson() val locationString = gson.toJson(location).toString()这样会将 '=' 转义,解决办法如下:
val gson = GsonBuilder().disableHtmlEscaping().create() val locationString = gson.toJson(location).toString()可以看到在创建 Gson 对象时有所区别,主要原因是
escapeHtmlChars属性,该属性默认为 true,会将 html 中的字符例如 '<', ' >' 这样的字符处理转义掉,设置为 false 后,就不会转义这些字符。