Bitmap 转 Base64 字符串及转 Json 后新增换行符及部分符号被转义

问题描述

场景是 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 后,就不会转义这些字符。

发布于 2022-07-08 16:15