Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Убрать UTF-8 BOM в файле

00 голосов
8
Создаю отдельный файл test.php
Хочу в нем использовать некоторое API битрикса.
Подключаю его:
Код
define("NO_KEEP_STATISTIC", true); //Не учитываем статистику
define("NOT_CHECK_PERMISSIONS", true); //Не учитываем права доступа
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");


Получаю все нужны мне данные и вывожу их в json.
Код
echo json_encode($json);


Все отлично выводится, но проблема в том, что отображение json происходит в кодировке UTF-8 BOM и этот мерзкий управляющий знак не дает работать json_decode.
У меня совершенно точно в моем файле кодировка UTF-8. Подозреваю, что откуда-то его ставит битрикс. Как и откуда?
спросил 29 Май, 13 от maxdj (480 баллов)

8 Ответы

00 голосов
скорее всего ставит ваш редактор
ответил 29 Май, 13 от HolyRage (280 баллов)
00 голосов
Пробовал два редактора. Писал код для теста с нуля.
Все равно получается эта проблема.
Советую попробовать у себя.
ответил 01 Июнь, 13 от maxdj (480 баллов)
00 голосов
Совершенно точно у меня нет никаких невидимых символов.
Вот скриншот из HEX редактора:
Рисунок
Вероятно, все же это делает как-то битрикс. Убирая код битрикса из файла я лишаюсь этой проблемы.
ответил 01 Сен, 13 от maxdj (480 баллов)
00 голосов
Битрикс BOM не ставит. 
Скорее всего, у вас он попал при редактировании конфигурационных файлов. Проверьте файлы папки /bitrix/php_interface
ответил 30 Ноя, 13 от Olly (820 баллов)
00 голосов
Схожая ситуация. Я не вижу BOM в файле даже HEX редактором:
Рисунок
Но если я Notepad++ ставлю кодировку UTF-8 — у меня расползается весь сайта. Если ставлю UTF-8 BOM, то все в порядке.
ответил 12 Март, 14 от maxdj (480 баллов)
00 голосов
В php_interface проверил все файлы. Там нет BOM.
Он есть в парочке файлов платежных систем, которые находятся в папке sale_payment
Могут ли они влиять?

Я пока для теста делаю json из простейшего массива, который генерирую сам.
ответил 03 Июль, 14 от maxdj (480 баллов)
00 голосов
Совершенно точно BOM добавляется не из мои файлов.

Что я делаю.
1. Есть файл a.php в нем формируется некий массив и выводится
Код
echo json_encode($json);

2. Есть файл b.php в нем и читают данные из файла a.php
Код
$json = file_get_contents("http://site.ru/a.php");
$json = json_decode($json);
print_r($json);


Все отлично работает.
Теперь я добавляю в файл a.php строчки для работы с API битрикс:
Код
define("NO_KEEP_STATISTIC", true); //Не учитываем статистику
define("NOT_CHECK_PERMISSIONS", true); //Не учитываем права доступа
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");


Получаю данные из битрикса и снова формирую из массива json: json_encode($json);

Пробуем еще раз в файле b.php получить данные. И после json_decode ничего не возвращается. Если получать json_last_error, то получим JSON_ERROR_SYNTAX

Ок, может у нас формируется поврежденный json?
Попробуем закодировать и раскодировать в том же файле a.php. Все работает.

Очевидно, что проблема в звене a.php -> b.php
Ок, проверим BOM. В b.php пишем:
Код
$json = file_get_contents("http://site.ru/a.php");

$bom = chr(0xEF).chr(0xBB).chr(0xBF); //сигнатура BOM
echo substr_compare($bom, $json, 0, strlen($bom)) == 0; //выведет 1 если есть и 0 если нет

Разумеется, выводит 1.

Вывод: в моих файлах установлена правильная кодировка, у меня формируется правильный json, в файлах в папке php_interface (кроме пары файлов платежек, которые я исключил) кодировка UTF-8 без BOM.
Внимание, вопрос: кто виноват и что делать?
ответил 03 Ноя, 14 от maxdj (480 баллов)
00 голосов
В общем, ищутся такие штуки просто. Теперь я это знаю.
Включаем отображение ошибок и видим, что headers already sent. И имя файла.
В моем случае это был prolog.before.php. Из-за него пол сайта не работало.

Буду умнее. Узнал очень много нового перечитав кучу мануалов в поисках проблем.
ответил 03 Март, 15 от maxdj (480 баллов)

Похожие вопросы

0 голосов
4 ответов
спросил 11 Янв, 14 от Ashihei (100 баллов)
0 голосов
6 ответов
спросил 06 Окт, 13 от ErickJ (120 баллов)
0 голосов
3 ответов
спросил 13 Март, 14 от hencok (180 баллов)
0 голосов
4 ответов
спросил 02 Янв, 14 от Nadejda (180 баллов)
0 голосов
7 ответов
спросил 07 Окт, 13 от Mikstik (220 баллов)