接收json格式错误,开头出现多余问号

2 篇文章 0 订阅
1 篇文章 0 订阅

问题场景:

java后台调用php开发的服务接口返回json,数据toString后json数据开头出现多余问号;

    ?{"succ":true,"data":{"id":"31","keywords":"","description":""}};

问题原因:

返回的json字符串里含有bom头。

bom头是什么!

BOM: Byte Order Mark
就是一个字节顺序标签,类似一个标记,又叫签名,

BOM签名的意思就是告诉编辑器当前文件采用何种编码,方便编辑器识别,但是BOM虽然在编辑器中不显示,但是会产生输出,就像多了一个空行。
一般的编码集中并不会出现bom头,unicode编码集中会出现。
常见的bom头是:【摘录自:http://www.cnblogs.com/chengmo/archive/2010/10/30/1864004.html

UTF-8 ║ EF BB BF
UTF-16LE ║ FF FE (小尾)
UTF-16BE ║ FE FF (大尾)
UTF-32LE ║ FF FE 00 00
UTF-32BE ║ 00 00 FE FF

为什么bom头会产生乱码?


有bom头的存储或者字节流,它一定是unicode字符集编码。到底属于那一种(utf-8还是utf-16或是utf-32),通过头可以判断出来。

由于已经说过utf-16,utf-32不指定bom头,解析程序默认就认为是ansi编码,出现乱码。而utf-8指定或者不指定程序都可判断知道对于的字符集编码。

问题就出在这里,可能有的应用程序,它就认为如果utf-8编码,就不需要指定bom头,它可以自己判断,相反指定了bom头,它还会出现问题

因为它把头当utf-8解析了)。如上面问题场景里的数据。


解决办法:

首先,对于本场景,java是没有根本解决办法的。(有些其他解决办法,毕竟治标不治本,大家可以自己去搜搜看看)这是oracle官网的原话(有点懒就不翻译了)

总之意思就是java utf-8 暂不能处理bom头!


所以,想从根源上解决的话,还得去搞php;

php文件本身的存储方式为带BOM的UTF-8,普通页面的中文乱码方式一般不是由这个原因导致的。

header("Content-type: text/html; charset=utf-8");
这句话
就可以控制html输出页面的编码方式

BOM只有在WINDOWS下采用“记事本”存储为UTF-8时才会有,
所以
根本原因就是这个,开发期间用记事本编辑过代码文件。

那么解决方法就有了,找到那个文件,找不到的排查所有代码文件,用notepad++或其他高级点的编辑器

存为utf-8编码,不带bom头的格式,然后应该就OK了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值