Использование PHP5 (cgi) для вывода файлов шаблонов из файловой системы и проблем с выделением необработанного HTML.
private function fetch($name) { $path = $this->j->config['template_path'] . $name . '.html'; if (!file_exists($path)) { dbgerror('Could not find the template "' . $name . '" in ' . $path); } $f = fopen($path, 'r'); $t = fread($f, filesize($path)); fclose($f); if (substr($t, 0, 3) == b'\xef\xbb\xbf') { $t = substr($t, 3); } return $t; }
Несмотря на то, что я добавил исправление спецификации, у меня все еще возникают проблемы с принятием Firefox. Вы можете увидеть живую копию здесь: http://ircb.in/jisti/ (и файл шаблона, который я написал в http://ircb.in/jisti/home.html, если вы хотите его проверить)
Любая идея, как это исправить? о_О
вы бы использовали следующий код для удаления utf8 bom
//Remove UTF8 Bom function remove_utf8_bom($text) { $bom = pack('H*','EFBBBF'); $text = preg_replace("/^$bom/", '', $text); return $text; }
пытаться:
// -------- read the file-content ---- $str = file_get_contents($source_file); // -------- remove the utf-8 BOM ---- $str = str_replace("\xEF\xBB\xBF",'',$str); // -------- get the Object from JSON ---- $obj = json_decode($str);
🙂
Еще один способ удалить спецификацию, которая является кодовой точкой Unicode U + FEFF
$str = preg_replace('/\x{FEFF}/u', '', $file);
b'\xef\xbb\xbf'
обозначает b'\xef\xbb\xbf'
строку "\ xef \ xbb \ xbf". Если вы хотите проверить спецификацию, вам нужно использовать двойные кавычки, поэтому последовательности \x
фактически интерпретируются в байтах:
"\xef\xbb\xbf"
Ваши файлы также содержат намного больше мусора, чем только одна ведущая спецификация:
$ curl http://ircb.in/jisti/ | xxd 0000000: efbb bfef bbbf efbb bfef bbbf efbb bfef ................ 0000010: bbbf efbb bf3c 2144 4f43 5459 5045 2068 .....<!DOCTYPE h 0000020: 746d 6c3e 0a3c 6874 6d6c 3e0a 3c68 6561 tml>.<html>.<hea ...
Это глобальное решение funtion для кодировки базовой системы UTF-8. Танки!
function prepareCharset($str) { // set default encode mb_internal_encoding('UTF-8'); // pre filter if (empty($str)) { return $str; } // get charset $charset = mb_detect_encoding($str, array('ISO-8859-1', 'UTF-8', 'ASCII')); if (stristr($charset, 'utf') || stristr($charset, 'iso')) { $str = iconv('ISO-8859-1', 'UTF-8//TRANSLIT', utf8_decode($str)); } else { $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); } // remove BOM $str = urldecode(str_replace("%C2%81", '', urlencode($str))); // prepare string return $str; }
Дополнительный метод для выполнения одной и той же работы:
function remove_utf8_bom_head($text) { if(substr(bin2hex($text), 0, 6) === 'efbbbf') { $text = substr($text, 3); } return $text; }
Другие методы, которые я нашел, не могут работать в моем случае.
Надеюсь, это поможет в некоторых особых случаях.
Если вы читаете некоторый API с помощью file_get_contents
и получаете необъяснимый NULL
из json_decode
, проверьте значение json_last_error()
: иногда значение, возвращаемое из file_get_contents
будет иметь постороннюю спецификацию, которая почти невидима при проверке строки, но сделает json_last_error()
чтобы вернуть JSON_ERROR_SYNTAX
(4).
>>> $json = file_get_contents("http://api-guiaserv.seade.gov.br/v1/orgao/all"); => "\t{"orgao":[{"Nome":"Tribunal de Justi\u00e7a","ID_Orgao":"59","Condicao":"1"}, ...]}" >>> json_decode($json); => null >>>
В этом случае проверьте первые 3 байта – эхо их не очень полезно, потому что спецификация невидима для большинства настроек:
>>> substr($json, 0, 3) => " " >>> substr($json, 0, 3) == pack('H*','EFBBBF'); => true >>>
Если строка выше возвращает TRUE для вас, тогда простой тест может решить проблему:
>>> json_decode($json[0] == "{" ? $json : substr($json, 3)) => {#204 +"orgao": [ {#203 +"Nome": "Tribunal de Justiça", +"ID_Orgao": "59", +"Condicao": "1", }, ], ... }
Это может помочь. сообщите мне, если вы хотите, чтобы я расширил мой мыслительный процесс.
<?php // // labled TESTINGSTRIPZ.php // define('CHARSET', 'UTF-8'); $stringy = "\xef\xbb\xbf\"quoted text\" "; $str_find_array = array( "\xef\xbb\xbf"); $str_replace_array = array( ''); $RESULT = trim( mb_convert_encoding( str_replace( $str_find_array, $str_replace_array, strip_tags( $stringy ) ), 'UTF-8', mb_detect_encoding( strip_tags($stringy) ) ) ); print("YOUR RESULT IS: " . $RESULT.PHP_EOL); ?>
Результат:
terminal$ php TESTINGSTRIPZ.php YOUR RESULT IS: "quoted text" // < with no hidden char.