关于服务器返回“”乱码的跳坑记录

关于服务器返回“”乱码的跳坑记录
Sep 1st 2018

@([Coding]WxAppDev)[编码, JSON, 小程序]

今天在写(抄)小程序的过程中遇到了个坑,历时半个小时才跳出来。侥幸之余,特此记录。

问题表现是,上传文件的接口返回的JSON数据前总会有“”这三个字符。

其他接口都没这个问题,都是直接返回干干净净的”{ }”
之前也有过一次,因为没给新浪SAE交认证费,导致SAE后台除了业务代码外还自动附送一段“温馨提示” ,结果自然不能正常解析。

DEBUG开始–>

1.搜了一遍后台代码是不是还有多余的echo语句。没有。

2.在代码各段分别加echo “–Mark–”,尝试观察这三个字符出现的位置。发现是在业务代码之前。

3.未果,怀疑是这个接口调用了其他前置的代码有问题。

4.接着去搜了一下,果然发现了罪魁祸首。

Ref1——UTF-8文件的BOM头的来由及去除方法

  1. 什么是BOM头
    在utf-8编码文件中BOM在文件头部,占用三个字节,用来标识该文件属于utf-8编码,现在已经有很多软件识别BOM头,但还是有些不能识别BOM头,比如PHP就不能识别BOM头,这也就是用记事本编辑utf-8编码的PHP文件后,就会报错的原因。
  1. 包含BOM头文件的产生
    在windows环境下,用记事本打开任何一个文本文件,另存为utf-8格式后,这样文件就自动被加上了BOM头信息—三个字节 \xef\xbb\xbf。
  1. 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);
}
?>

奇迹出现了!
enter image description here

enter image description here

在去除这两个BOM头信息之后,服务器返回的JSON终于又干净了。

编码问题真的是烦。