Excel в Mac показывает «_» вместо акцентов при создании отчета через консоль

У меня есть огромный запрос с множеством взаимосвязей, объединений и функций БД. Вот пример извлечения запроса:

SELECT * FROM (
    SELECT DISTINCT 
        CASE WHEN objeto.objeto_clave IS NULL THEN objeto.objeto_numero ELSE objeto.objeto_clave END AS "Número", 
        CASE WHEN objeto.objeto_estatus = 'V' THEN 'Válido' ELSE 'No válido' END AS "Válido"
    FROM objeto

    WHERE objeto.objeto_id IN (1, 2, 3) 

    GROUP BY objeto.objeto_id, objeto.objeto_numero, objeto.objeto_clave, objeto.objeto_estatus 
) AS "Excel" ORDER BY (CASE WHEN "Número" IS NULL THEN substring("Número",3) ELSE substring("Número",6) END) ASC

Я использую cakephp 2.x для создания отчета excel с помощью метода, который позволяет вам загружать файл excel, берущий данные из соединения с базой данных (имя_базы_данных, пользователь и т. д.), запрос sql и выполнение системной команды для создания файл, заполненный данными, полученными в результате запроса, с использованием параметра -H для табличного вывода HTML и -c для выполнения sql как команды:

$command = <<<CMMD
psql -h $host -p $port -d $db -U $login -H -c "$sql" > $file
CMMD;

system($command);

//Cleaning content
if (is_file($file)) {
   $content = file_get_contents($file);
   $content = substr($content, 0, strpos($content, '<p>'));
   $content = utf8_decode($content);
   file_put_contents($file, $content);
}

Все отлично работает на платформе Windows. Проблема возникает, когда вы загружаете файл с помощью Mac, файл создается, но когда вы его открываете, имена столбцов и данные в ячейках с акцентами, такими как: «Número» и «Válido», преобразуются в «N_mero» и «V_lido».

Я хотел бы знать, с чем связана проблема (код, специальная кодировка [Mac Excel], что-то с функцией utf8_decode, что-то еще?) и как я могу с этим справиться.

Это не показывает никаких проблем, если я использую openOffice на том же Mac.


person Antonycx    schedule 20.09.2016    source источник


Ответы (1)


После дня исследований и просмотра некоторых других вопросов на этом сайте

Я обнаружил, что это связано с поддержкой кодирования версии Excel для Mac:

Mac в настоящее время не поддерживает UTF-8

затем я увидел некоторые обходные пути для решения этой проблемы, и большинство из них указывало на использование третьей программы для преобразования кодировки файла в UTF16LE, чтобы правильно выполнять такие действия, как импорт/экспорт данных в Excel.

Я решаю свою проблему, заменяя функцию utf-8 и заменяя ее следующим образом:

//$content = utf8_decode($content);
//Converting to UTF16LE with BOM [chr(255) . chr(254)] for MAC version
$content = chr(255) . chr(254) . mb_convert_encoding($content, 'UTF-16LE', 'UTF-8');
file_put_contents($file, $content);

данные теперь правильно интерпретируются Mac и отображаются по желанию.

Объяснение можно найти здесь и здесь

person Antonycx    schedule 21.09.2016