From 3540e6c38524f8712c4f7be77eed0c8aefc8f66e Mon Sep 17 00:00:00 2001 From: Matthieu Marcillaud <marcimat@rezo.net> Date: Tue, 15 Oct 2019 17:25:06 +0200 Subject: [PATCH] =?UTF-8?q?On=20se=20synchronise=20avec=20Spip-Bonux-3=20u?= =?UTF-8?q?n=20peu=20plus=20sur=20les=20fonctions=20d=E2=80=99import=20/?= =?UTF-8?q?=20export=20CSV,=20et=20notamment=20on=20int=C3=A8gre=20r102584?= =?UTF-8?q?=20qui=20permet=20de=20sp=C3=A9cifier=20un=20charset=20sur=20l?= =?UTF-8?q?=E2=80=99import.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecrire/inc/exporter_csv.php | 6 +++--- ecrire/inc/importer_csv.php | 40 ++++++++++++++++++++++++++++--------- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/ecrire/inc/exporter_csv.php b/ecrire/inc/exporter_csv.php index e419bf23b7..729bc92afd 100644 --- a/ecrire/inc/exporter_csv.php +++ b/ecrire/inc/exporter_csv.php @@ -52,12 +52,11 @@ function exporter_csv_champ($champ) { * Si défini exporte dans le charset indiqué * @return string */ -function exporter_csv_ligne($ligne, $delim = ', ', $importer_charset = null) { +function exporter_csv_ligne($ligne, $delim = ',', $importer_charset = null) { $output = join($delim, array_map('exporter_csv_champ', $ligne)) . "\r\n"; if ($importer_charset) { $output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset); } - return $output; } @@ -104,6 +103,7 @@ function inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null } $filename = "$filename.$extension"; + $output = ''; if ($entetes and is_array($entetes) and count($entetes)) { $output = exporter_csv_ligne($entetes, $delim, $importer_charset); } @@ -124,7 +124,7 @@ function inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null header("Content-Type: text/comma-separated-values; charset=$charset"); header("Content-Disposition: attachment; filename=$filename"); //non supporte - //Header("Content-Type: text/plain; charset=$charset"); + //header("Content-Type: text/plain; charset=$charset"); header("Content-Length: $length"); ob_clean(); flush(); diff --git a/ecrire/inc/importer_csv.php b/ecrire/inc/importer_csv.php index 33fde21a08..4b2ace7021 100644 --- a/ecrire/inc/importer_csv.php +++ b/ecrire/inc/importer_csv.php @@ -31,18 +31,33 @@ include_spip('inc/charsets'); /** * Importer le charset d'une ligne * - * @param string $texte + * Importe un texte de CSV dans un charset et le passe dans le charset du site (utf8 probablement) + * Les CSV peuvent sous ms@@@ avoir le charset 'iso-8859-1', mais pasfois aussi 'windows-1252' :/ + * + * @param mixed $texte + * @param bool|string $definir_charset_source + * false : ne fait rien + * string : utilisera pour les prochains imports le charset indiqué + * true : remet le charset d'import par défaut de la fonction * @return array */ -function importer_csv_importcharset($texte) { +function importer_csv_importcharset($texte, $definir_charset_source = false) { // le plus frequent, en particulier avec les trucs de ms@@@ - $charset_source = 'iso-8859-1'; + static $charset_source = 'iso-8859-1'; + if ($definir_charset_source) { + if ($definir_charset_source === true) { + $charset_source = 'iso-8859-1'; + } else { + $charset_source = $definir_charset_source; + } + } // mais open-office sait faire mieux, donc mefiance ! if (is_utf8($texte)) { - $charset_source = 'utf-8'; + $charset = 'utf-8'; + } else { + $charset = $charset_source; } - - return importer_charset($texte, $charset_source); + return importer_charset($texte, $charset); } /** @@ -66,13 +81,17 @@ function importer_csv_nettoie_key($key) { * @param string $delim * @param string $enclos * @param int $len + * @param string $charset_source + * Permet de définir un charset source du CSV, si différent de utf-8 ou iso-8859-1 * @return array */ -function inc_importer_csv_dist($file, $head = false, $delim = ", ", $enclos = '"', $len = 10000) { +function inc_importer_csv_dist($file, $head = false, $delim = ',', $enclos = '"', $len = 10000, $charset_source = '') { $return = false; if (@file_exists($file) - and $handle = fopen($file, "r") - ) { + and $handle = fopen($file, 'r')) { + if ($charset_source) { + importer_csv_importcharset('', $charset_source); + } if ($head) { $header = fgetcsv($handle, $len, $delim, $enclos); if ($header) { @@ -109,6 +128,9 @@ function inc_importer_csv_dist($file, $head = false, $delim = ", ", $enclos = '" $return[] = $data; } } + if ($charset_source) { + importer_csv_importcharset('', true); + } } return $return; -- GitLab