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