PHP синтаксический анализатор, в котором есть символы, такие как "é", "í", в начале поля - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь проанализировать CSV-файл в PHP.Моя проблема заключается в следующем: если есть поле, содержащее «é» или «í», парсер съедает все эти символы с начала поля.

Проблема присутствует только на моем хосте, этоотсутствует при локальном использовании XAAMP (более новая версия PHP).Версия PHP на моем хосте с ошибкой: 5.2.6-1 + lenny9

Код - это всего лишь одна строка из fgetcsv.

while (($program = fgetcsv($handle, 0, ',', '"')) !== FALSE) {...}

Этот код уже выводит «съеденную» версию, например, когда просматривается print_r.

Что я могу сделать?Это должно быть ошибка в PHP, которая была исправлена ​​с тех пор.Одна альтернативная опция, которую я обнаружил, состояла в том, чтобы просто избежать последовательности, поставив запятую в конце поля (мой источник csv, Google Spreadsheets автоматически оборачивает поле в "", если есть, присутствует внутри).Затем я могу написать функцию, которая удаляет последний символ, если это запятая (какая-либо помощь по этому поводу?).

Является ли (или это было) известной ошибкой в ​​PHP, и были ли какие-то решения для этого?Если нет, можете ли вы помочь мне с функцией удаления последнего символа-если-запятая?

1 Ответ

0 голосов
/ 29 марта 2011

Ваша настоящая проблема в том, что веб-сервер работает в локали, которая запрещает многобайтовые кодировки.Если установлено значение C, я получаю тот же результат:

<?php print_r(str_getcsv("ée, íi, zz, bb, "));

$   LC_ALL=C   php test_getcsv.php

Срезы é и í в полях.[0] => e [1] => i [2] => zz

Но когда я запускаю это так:

$   LC_ALL=de_DE.UTF-8  php test_getcsv.php

Я получаю правильные результаты.[0] => ée [1] => íi [2] => zz

Вам необходимо выяснить, какие локали доступны на вашем сервере, а затем использовать setlocale(LC_ALL, "xy_zz.UTF-8") в начале вашего скрипта.

...