utf 8 — парсинг данных из файла с переполнением стека

У меня странная проблема с анализом данных из файла с file_get_contents.

Содержимое файла: 0,0,0 (есть 3 случайных числа в диапазоне от 0 до 255, разделенных запятой)

$s = file_get_contents($this->filePath);
var_dump(trim($s));
$rgb = explode(',', trim($s));
var_dump($rgb);

Выход:

string(8) "0,0,0"array(3) {
[0]=>
string(4) "0"[1]=>
string(1) "0"[2]=>
string(1) "0"}

И если я попытаюсь преобразовать в целое число:

string(14) "255,128,255"array(3) {
[0]=>
string(6) "255"[1]=>
string(3) "128"[2]=>
string(3) "255"}

echo((int)$rgb[0]); // -> 0
echo((int)$rgb[1]); // -> 128
echo((int)$rgb[2]); // -> 255

Файл находится в кодировке UTF-8, и я думаю, что в проанализированной строке есть какой-то символ пробела, но я не знаю, что мне с ним делать, потому что простая обрезка не работает.

Спасибо за идеи!

0

Решение

Ваш файл начинается с метки порядка байтов (BOM). Длина обеих ваших строк — дешевая распродажа, так как они имеют длину 3 байта.

В идеале вы должны попытаться устранить эту проблему в источнике, сохранив свой файл без спецификации в начале. Однако, если это не вариант, вы можете удалить его вручную из строки:

$str = file_get_contents($this->filePath);
$bom = pack("CCC", 0xef, 0xbb, 0xbf);
if (strncmp($str, $bom, 3) === 0) {
$str = substr($str, 3);
}

Я использовал очень немного измененную версию кода, взятого из этот блог. По сути, он сравнивает первые 3 байта строки с спецификацией и при необходимости удаляет их из строки.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]