关于服务器返回“”乱码的跳坑记录
Sep 1st 2018
@([Coding]WxAppDev)[编码, JSON, 小程序]
今天在写(抄)小程序的过程中遇到了个坑,历时半个小时才跳出来。侥幸之余,特此记录。
问题表现是,上传文件的接口返回的JSON数据前总会有“”这三个字符。
其他接口都没这个问题,都是直接返回干干净净的”{ }”
之前也有过一次,因为没给新浪SAE交认证费,导致SAE后台除了业务代码外还自动附送一段“温馨提示” ,结果自然不能正常解析。
DEBUG开始–>
1.搜了一遍后台代码是不是还有多余的echo语句。没有。
2.在代码各段分别加echo “–Mark–”,尝试观察这三个字符出现的位置。发现是在业务代码之前。
3.未果,怀疑是这个接口调用了其他前置的代码有问题。
4.接着去搜了一下,果然发现了罪魁祸首。
Ref1——UTF-8文件的BOM头的来由及去除方法
- 什么是BOM头
在utf-8编码文件中BOM在文件头部,占用三个字节,用来标识该文件属于utf-8编码,现在已经有很多软件识别BOM头,但还是有些不能识别BOM头,比如PHP就不能识别BOM头,这也就是用记事本编辑utf-8编码的PHP文件后,就会报错的原因。
- 包含BOM头文件的产生
在windows环境下,用记事本打开任何一个文本文件,另存为utf-8格式后,这样文件就自动被加上了BOM头信息—三个字节 \xef\xbb\xbf。
- BOM头信息的去除方法
用Notepad++打开文件,选择 格式 -> 以UTF-8无BOM格式编码,再保存就行。
Ref2——2017-6-8 php 问题
参见Ref2链接的解决办法,把以下代码存成php文件放到根目录,然后访问运行~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| <?php if (isset($_GET['dir'])) { //设置文件目录 $basedir = $_GET['dir']; } else { $basedir = '.'; }
$auto = 1; checkdir($basedir);
function checkdir($basedir) { if ($dh = opendir($basedir)) { while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..') { if (!is_dir($basedir . "/" . $file)) { echo "filename: $basedir/$file " . checkBOM("$basedir/$file") . " <br>"; } else { $dirname = $basedir . "/" . $file; checkdir($dirname); } } } closedir($dh); } } function checkBOM($filename) { global $auto; $contents = file_get_contents($filename); $charset[1] = substr($contents, 0, 1); $charset[2] = substr($contents, 1, 1); $charset[3] = substr($contents, 2, 1); if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) { if ($auto == 1) { $rest = substr($contents, 3); rewrite($filename, $rest); return ('<font color="red">BOM found, automatically removed.</font>'); } else { return ('<font color="red">BOM found.</font>'); } } else return ("BOM Not Found."); }
function rewrite($filename, $data) { $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum); } ?>
|
奇迹出现了!
在去除这两个BOM头信息之后,服务器返回的JSON终于又干净了。
编码问题真的是烦。