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