Ответ 1
вы можете использовать следующий код для удаления utf8 bom
//Remove UTF8 Bom
function remove_utf8_bom($text)
{
$bom = pack('H*','EFBBBF');
$text = preg_replace("/^$bom/", '', $text);
return $text;
}
Использование 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'
обозначает буквенную строку "\ 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;
}
если кто-то использует импорт csv, то ниже код полезен
$header = fgetcsv($handle);
foreach($header as $key=> $val) {
$bom = pack('H*','EFBBBF');
$val = preg_replace("/^$bom/", '', $val);
$header[$key] = $val;
}
Дополнительный метод для выполнения той же работы:
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.
Решение без функции pack
:
$a = "1";
var_dump($a); // string(4) "1"
function deleteBom($text)
{
return preg_replace("/^\xEF\xBB\xBF/", '', $text);
}
var_dump(deleteBom($a)); // string(1) "1"
При работе с неисправным программным обеспечением случается, что часть спецификации умножается с каждым сохранением.
Поэтому я использую это, чтобы избавиться от этого.
function remove_utf8_bom($text) {
$bom = pack('H*','EFBBBF');
while (preg_match("/^$bom/", $text)) {
$text = preg_replace("/^$bom/", '', $text);
}
return $text;
}