php функция file_get_contents и первая строка текста в кодировке UTF-8

У меня есть следующий код:

$array_test = array();

$file = file_get_contents ('./test.txt');

$file_array = explode("\n", $file);

foreach ($file_array as $line) {

    $word = trim($line);
    $array_test[] = $word;
}

echo $array_test[0];

if ($array_test[0] == "1") { echo 'first line'; }

echo $array_test[1];

if ($array_test[1] == "2") { echo 'second line'; }

print_r ($array_test);

Файл test.txt закодирован в кодировке UTF-8. В нем 5 строк. На каждой строке у меня есть номер: 1 - первая строка, 2 - вторая строка и т.д.

Результат работы скрипта следующий:

1
2
second line
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

Как видите, есть проблема с первой строкой. Вроде правильно добавился в массив, но почему-то его значение отличается от "1". С остальными проблем нет, только с первым. Проблему можно исправить, пропустив первую строку и начав добавлять в массив значения из второй строки, но мне просто интересно, почему это не работает так, как я написал? Обычно у меня не возникает проблем с отображением или чтением текстов или страниц в кодировке UTF8. Изменение на «файл» вместо «file_get_contents» не решает проблему. Любое предложение будет очень признательно. p.s. PHP версии 5.3.1

ОБНОВЛЕНИЕ: проблема заключалась в спецификации UTF-8. См. решение ниже. Спасибо всем за помощь!


person easypronunciation    schedule 24.01.2013    source источник
comment
попробуйте $file_array = взорвать(\n\r, $file); или, пожалуйста, поделитесь этим текстовым файлом.   -  person Dipesh Parmar    schedule 24.01.2013


Ответы (3)


Основная проблема заключается в этом, но я пока не могу ее решить. На var_dump($array_test[0]) я получаю следующий вывод:

string '1' (length=4)

Это причина, по которой «первая строка» не отображается, поскольку условие if не выполняется.

Кроме того, если вы можете поделиться своим файлом test.txt, проблему будет легко обнаружить.

EDIT: частичное решение

Вы можете добавить эту строку перед первым условием if для обработки этого поведения, как описано @Tino Didriksen, чтобы получить желаемый результат.

$array_test[0] = substr_replace($array_test[0],'',0,3);
person SilentAssassin    schedule 24.01.2013
comment
Да, проблема почти наверняка в том, что файл имеет спецификацию UTF-8. Первые 3 байта файла должны быть отброшены, если они точно равны 0xEF 0xBB 0xBF (что в обычном текстовом редакторе выглядит как ). - person Tino Didriksen; 24.01.2013
comment
Спасибо! Это спецификация UTF-8. Окончательное решение - я добавил следующую строку: if (substr($file, 0, 3) == pack(CCC,0xef,0xbb,0xbf)) { $file = substr($file, 3); } И это прекрасно работает. - person easypronunciation; 24.01.2013
comment
@TinoDidriksen, это обоснование неверно, дело не в том, что это выглядит так, потому что вы используете простой текстовый редактор, а в том, что вы используете Windows-1252 для декодирования, а кодировка UTF-8 в Windows-1252 декодирует эти символы. - person Esailija; 25.01.2013

(Попробуйте сделать) -- неправильное решение. Смотри ниже

if($array_test[0] === "1") echo "first line";

и для таких случаев есть одна функция file():

$file = file_get_contents ('./test.txt');
$file_array = explode("\n", $file);

Я ошибался!

var_dump дает нам ответ:

string(2) "1
"

в строке есть символ новой строки.

попробуйте сделать:

$word = trim($line,"\r\n ");
person Soul_man    schedule 24.01.2013

Пожалуйста, попробуйте ниже обновленный код:

$array_test = array();

$file = file_get_contents ('./test.txt');

$file_array = explode("\n", $file);

foreach ($file_array as $line) {

    $word = trim($line);
    $array_test[] = $word;
}

echo $array_test[0];

if ($array_test[0][0] == "1") { echo 'first line'; }

echo $array_test[1];

if ($array_test[1][0] == "2") { echo 'second line'; }
person kwelsan    schedule 24.01.2013