標籤:fwrite 個人 bom 加密 pen lob app rem 綜合
最近在做小程式,在測試的時候遇到一個奇怪的問題,請求的資料無法渲染,資料請求成功了,但是頁面上沒有響應。開發工具上,和蘋果手機上測試是好好的,就安卓出現了問題,還是ios系統厲害些。出了問題,一臉的懵逼,咋辦!搜唄。小程式,就老老實實上百度吧。輸入‘小程式 安卓 渲染’,我去還真有,看樣子是安卓的老毛病。這裡截個圖給大家看看,問題是一樣的。
看到這篇關於小程式綜合社區的問答,估計八九不離十,是這個“\ufeff”的問題,也就是代碼是編碼格式問題,utf8和utf8無bom。這個問題別人是解決了的,那就完全不是問題了,。我也來試試看,在這邊的js也像這樣過濾下,麻蛋,小程式jscore好像不支援str.replace(),直接報錯了,前面這個人感覺有點坑人啊,不說清楚,我就試試在後端拿資料的時候就直接過濾掉“\ufeff”,試了好多次還是不行。調試蠻浪費時間的,大多數時候,懟著問題好長時間都沒有解決的話,我們應該適當的把它放一放。
後來,終於在在小程式綜合社區找到了,可以說的官方的解答:官方的加密資料解密演算法PHP – SDK裡的三個檔案有帶BOM頭,要去除。簡直完美,在這裡我也記錄下終極的解決方案。
官方解釋:近日有發現類似問題的都是因為返回的資料是 UTF-8 with BOM(即資料的開頭是一個不可見字元 unicode 65279),Android 平台沒有自動過濾,導致 JSON.parse 失敗。目前需要開發人員自行相容,下個版本 Android 會過濾此字元。
附上連結:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=2484
將下面的代碼儲存為php檔案,在網站的根目錄下運行即可。
if (isset($_GET[‘dir’])){ //config the basedir
$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);
}
現在看來,問題是小問題;但解決不了就是大問題了,平時還是多看看官方的論壇,社區。
小程式安卓渲染問題