Экспорт CSV с помощью League / CSV не кодирует umlauts

#php #laravel #csv #utf-8 #byte-order-mark

#php #laravel #csv #utf-8 #знак порядка байтов

Вопрос:

Я экспортирую модель в Laravel 5.7, используя пакет League / CSV:

 public function export(Request $request)
{
    $people = Person::all();
    $location = 'export.csv';
    $csv = Writer::createFromPath($location, 'w');
    $csv->setOutputBOM(Writer::BOM_UTF8);
    $csv->setDelimiter(';');
    foreach ($people as $person) {
        $csv->insertOne($this->serializePerson($person));
    }
    return response($location);
}

protected function serializePerson($person)
{
    return [
        $person->name,
        $person->age,
    ];
}
  

Это создает export.csv файл нормально, но любые умляуты отображаются неправильно (например, как √∂ ). Я бы подумал, что настройка спецификации решила бы эту проблему. У кого-нибудь есть решение?

РЕДАКТИРОВАТЬ: Проблема была не в экспорте, а в том, что Mac Excel неправильно отображал умляуты. Смотрите мой ответ ниже.

Комментарии:

1. вы пробовали какой-либо из методов кодирования? пример: $reader->addStreamFilter('convert.iconv.ISO-8859-15/UTF-8'); ?

2. Добавим, что умляута больше нет √∂ , он есть сейчас √ɬ∂ .

Ответ №1:

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

Чтобы заставить его правильно работать в Excel (на Mac), мне пришлось:

  1. Откройте пустой лист
  2. Данные> Получить внешние данные > Импортировать текстовый файл…
  3. В раскрывающемся списке Источник файла выберите «Unicode (UTF-8)»