From 2fa306b5a720144600b902691b70dc63ed67d059 Mon Sep 17 00:00:00 2001 From: Rike-cz Date: Tue, 31 Mar 2020 17:15:17 +0200 Subject: [PATCH 1/2] Add iconv fallback support for mbstring unsupported encodings (#5015) --- .../importexportcontroller/TranscodeFilter.php | 18 +++++++++++++----- modules/backend/lang/en/lang.php | 1 + modules/backend/models/ImportModel.php | 1 + 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/modules/backend/behaviors/importexportcontroller/TranscodeFilter.php b/modules/backend/behaviors/importexportcontroller/TranscodeFilter.php index d684c912b..93f99c1ae 100644 --- a/modules/backend/behaviors/importexportcontroller/TranscodeFilter.php +++ b/modules/backend/behaviors/importexportcontroller/TranscodeFilter.php @@ -20,11 +20,19 @@ class TranscodeFilter extends php_user_filter public function filter($in, $out, &$consumed, $closing) { while ($resource = stream_bucket_make_writeable($in)) { - $resource->data = @mb_convert_encoding( - $resource->data, - $this->encodingTo, - $this->encodingFrom - ); + if (in_array($this->encodingFrom, mb_list_encodings())) { + $resource->data = @mb_convert_encoding( + $resource->data, + $this->encodingTo, + $this->encodingFrom + ); + } else { + $resource->data = @iconv( + $this->encodingFrom, + $this->encodingTo, + $resource->data + ); + } $consumed += $resource->datalen; diff --git a/modules/backend/lang/en/lang.php b/modules/backend/lang/en/lang.php index 27e814100..de48f0b8e 100644 --- a/modules/backend/lang/en/lang.php +++ b/modules/backend/lang/en/lang.php @@ -550,6 +550,7 @@ return [ 'iso_8859_13' => 'ISO-8859-13 (Latin-7, Baltic Rim)', 'iso_8859_14' => 'ISO-8859-14 (Latin-8, Celtic)', 'iso_8859_15' => 'ISO-8859-15 (Latin-9, Western European revision with euro sign)', + 'windows_1250' => 'Windows-1250 (CP1250, Central and Eastern European)', 'windows_1251' => 'Windows-1251 (CP1251)', 'windows_1252' => 'Windows-1252 (CP1252)', ], diff --git a/modules/backend/models/ImportModel.php b/modules/backend/models/ImportModel.php index 34622b46b..12f937a16 100644 --- a/modules/backend/models/ImportModel.php +++ b/modules/backend/models/ImportModel.php @@ -231,6 +231,7 @@ abstract class ImportModel extends Model 'iso-8859-13', 'iso-8859-14', 'iso-8859-15', + 'Windows-1250', 'Windows-1251', 'Windows-1252' ]; From 802d8c8e09a2b342649393edb6d3ceb958851484 Mon Sep 17 00:00:00 2001 From: Luke Towers Date: Tue, 31 Mar 2020 09:53:35 -0600 Subject: [PATCH 2/2] Temporary workaround until the L6 upgrade can be merged in to use league/csv >= 9.1 --- modules/backend/behaviors/ImportExportController.php | 8 ++++++++ modules/backend/models/ExportModel.php | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/modules/backend/behaviors/ImportExportController.php b/modules/backend/behaviors/ImportExportController.php index 950234362..c146050b6 100644 --- a/modules/backend/behaviors/ImportExportController.php +++ b/modules/backend/behaviors/ImportExportController.php @@ -11,6 +11,7 @@ use Backend\Behaviors\ImportExportController\TranscodeFilter; use Illuminate\Database\Eloquent\MassAssignmentException; use League\Csv\Reader as CsvReader; use League\Csv\Writer as CsvWriter; +use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula; use ApplicationException; use SplTempFileObject; use Exception; @@ -624,6 +625,9 @@ class ImportExportController extends ControllerBehavior $csv->setEnclosure($options['enclosure']); $csv->setEscape($options['escape']); + // Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter)) + $formatter = new CsvEscapeFormula(); + /* * Add headers */ @@ -657,6 +661,10 @@ class ImportExportController extends ControllerBehavior } $record[] = $value; } + + // Temporary until upgrading to league/csv >= 9.1.0 + $record = $formatter($record); + $csv->insertOne($record); } diff --git a/modules/backend/models/ExportModel.php b/modules/backend/models/ExportModel.php index e0ec00e3c..1a03a813b 100644 --- a/modules/backend/models/ExportModel.php +++ b/modules/backend/models/ExportModel.php @@ -5,6 +5,7 @@ use Lang; use Model; use Response; use League\Csv\Writer as CsvWriter; +use October\Rain\Parse\League\EscapeFormula as CsvEscapeFormula; use ApplicationException; use SplTempFileObject; @@ -111,6 +112,9 @@ abstract class ExportModel extends Model $csv->setEscape($options['escape']); } + // Temporary until upgrading to league/csv >= 9.1.0 (will be $csv->addFormatter($formatter)) + $formatter = new CsvEscapeFormula(); + /* * Add headers */ @@ -124,6 +128,10 @@ abstract class ExportModel extends Model */ foreach ($results as $result) { $data = $this->matchDataToColumns($result, $columns); + + // Temporary until upgrading to league/csv >= 9.1.0 + $data = $formatter($data); + $csv->insertOne($data); }