黑马程序员技术交流社区

标题: 【上海校区】为什么Base64编码有回车换行符 [打印本页]

作者: 不二晨    时间: 2018-11-2 08:56
标题: 【上海校区】为什么Base64编码有回车换行符
版权声明:本文为博主原创文章,未经博主允许不得转载。        https://blog.csdn.net/jifengwan/article/details/45460695
难得5.1在家休息,记录最近开发接口遇到的一个问题。

公司要求用终端发布文章的时,将文章的参数放入JSON对象,再转成字符串发给后台,后台把字符串解析成JSON对象,最后存储。

如果需要上传附件,将附件转成字节流,再用Base64编码,最后和文章参数一起放入JSON对象。



问题:如果上传附件,后台将字符串解析成JSON对象时出现如下异常:

net.sf.json.JSONException: Unterminated string

有博客说,字符串中有回车换行符,导致JSON格式不符合要求。

用debug查看JSON字符串确实有回车换行符:





谷歌了一下,原来是RFC2045中有规定:

The encoded output stream must be represented in lines of no more than 76 characters each.

Base64一行不能超过76字符,超过则添加回车换行符。

结合前面博客说的“有回车符,导致JSON格式不符合要求”,那就明白了,对附件进行Base64编码,因为超过76字节,所以要添加回车换行符,后台解析带有回车换行符的JSON字符串就出现“ net.sf.json.JSONException : Unterminated string ”。

问题根源就是回车换行符,那删除就行了,谷歌后又发现一问题,原来“回车换行符(\r\n)”是在Windows才有,而Linux只有换行(\n),Mac只有回车(\r)。

再搜索了一下找到了解决办法,调用字符串对象的replaceAll方法替换掉\r和\n,代码如下:

字符串对象.replaceAll("\r|\n", "");

这样就兼容了不同平台。




---------------------
【转载】
作者:小鸡也疯狂
原文:https://blog.csdn.net/jifengwan/article/details/45460695



作者: 不二晨    时间: 2018-11-7 09:10
ヾ(◍°∇°◍)ノ゙
作者: 梦缠绕的时候    时间: 2018-11-8 17:10

作者: 魔都黑马少年梦    时间: 2018-11-8 17:12





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2