php fgetcsv - проблемы с кодировкой кодировки

Использование PHP 5.3fgetcsv функция, я испытываю некоторые проблемы из-за вопросов кодирования. Обратите внимание, что этот файл имеет испанский "специальный" латинские буквы, такие как графические акценты á, é, í я, так далее...

Я получаю файл CSV, экспортирующий некоторые структурированные данные, которые есть в файле MS 2008 для Mac Excel.

Если я открою его с Mac OS XTextEdit приложение, кажется, все идет идеально.

Но когда я перехожу к своей программе PHP и пытаюсь прочитать CSV, используя эту функцию PHP fgetcsv, я не получаю ее для правильного чтения кодировки.

/**
 * @Route("/cvsLoad", name="_csv_load")
 * @Template()
 */
public function cvsLoadAction(){
    //setlocale(LC_ALL, 'es_ES.UTF-8');
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv');

    $i = 1;
    $r = array("hhh" => $reader -> getAll());

    return new Response(json_encode($r, 200));
}

Как вы можете видеть, я попытался также использоватьsetlocale вes_ES.UTF-8, Но ничего не получится.

Читаемая часть приходит сюда:

public function getRow()
{
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
        $this->_line++;
        return $this->_headers ? array_combine($this->_headers, $row) : $row;
    } else {
        return false;
    }
}

Посмотрите, что я получаю в переменной $ row после каждого чтения строки:

Те? персонажи должны быть гласными с графическим акцентом на них.

Есть какая-нибудь подсказка? Будет ли это работать, если я использовал MS Excel для Windows? Как я могу знать во время выполнения точную кодировку файла и установить его перед чтением?

(Для тех, кто говорит по-испански, нев этих текстах меня пугает такая ужасная медицинская штука;)).

 cmbuckley08 нояб. 2012 г., 23:06
FWIW, вы можетеправдазнать кодировка файла без уведомления. Вы можете догадаться, прочитав его, и соответственно преобразовать, но ничто не так надежно, как при кодировании.
 ElPiter08 нояб. 2012 г., 23:55
Спасибо, Кбакли. Что вы имеете в виду с "конвертировать соответственнопопытаться угадать и спросить пользователя, одобряет ли он импорт? А если нет, продолжайте пробовать другие кодировки для происхождения?
 Salman A08 нояб. 2012 г., 22:49
Та же проблема. Файл CSV в кодировке UTF8 нормально импортирует на один сервер, но не на другой. Закончил писать свой собственный читатель CSV.

Ответы на вопрос(2)

вероятно, связано со способом, которым Excel кодирует файл при сохранении.

Попробуйте загрузить файл .xls в Google docs и загрузить как .csv

 ElPiter08 нояб. 2012 г., 22:48
Я тоже пытался, но все идет еще хуже, я думаю. Тем не менее, япопробую еще раз. Спасибо за быстрый ответ. :)
Решение Вопроса

Попробуй это:

function convert( $str ) {
    return iconv( "Windows-1252", "UTF-8", $str );
}

public function getRow()
{
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) {
        $row = array_map( "convert", $row );
        $this->_line++;
        return $this->_headers ? array_combine($this->_headers, $row) : $row;
    } else {
        return false;
    }
}
 Esailija09 нояб. 2012 г., 00:00
Вы должны использовать эвристику .. сначала посмотрите, является ли это UTF-8 или UTF-16, если это 'Нет, определите PC / MAC (из заголовка пользовательского агента) и используйте Windows-1252 для ПК и Macintosh для Mac. Конечно, если пользователь не использует латинский скрипт, вы должны использовать Windows-1251 (кириллица для Windows) и так далее. Кто-то должен был написать библиотеку для этого: D
 Dalin24 янв. 2014 г., 16:57
Это сработало для меня. Но я подозреваю, что есть лучший способ (установить кодировку перед вызовом fopen ()). Так что я'Я не собираюсь голосовать.
 ElPiter08 нояб. 2012 г., 23:53
Это был один !! :) Большое спасибо. Просто несколько комментариев: во-первых, нужно объявить как статическую функцию convert и отобразить ее в array_map как 'самостоятельно: преобразовать»; во-вторых, в моем случае это был iconv (Макинтош ","UTF-8", $ str), так как MS Excel для Mac OS экспортирует в CSV с использованием Mac OS Roman. Наконец, хотя это отличный ответ и действительно помог мне, все же это еще не все, что решает мои потребности, поскольку я выиграл »Не знаю, будут ли мои пользователи загружать файл с Mac или ПК или чего-то еще ... какие-либо другие подсказки о том, как определить, какая кодировка загруженного файла? Еще раз спасибо!!
 cmbuckley08 нояб. 2012 г., 23:07
+1. Обратите внимание надокументы: если файл имеет однобайтовую кодировку (например, CP1252), но языковой стандарт является многобайтовым, то fgetcsv не работает должным образом.
 Esailija09 нояб. 2012 г., 00:10
@ElPiter Если вы можете ожидать, что ваши пользователи будут использовать Chrome или Firefox с включенным JavaScript, вы можете получить доступ к файлу 'содержание в javascript. Затем вы можете представить раскрывающийся список с различными кодировками и позволить пользователю выбрать тот, который показывает символы правильно, и отправить эту информацию вместе с файлом при загрузке.
 Kiran Dash23 февр. 2017 г., 09:36
Потрясающие. Со вчерашнего дня я чесал голову.

Ваш ответ на вопрос