[FEATURE] Auto-detect charset conversion 63/45663/4
authorBenni Mack <benni@typo3.org>
Thu, 7 Jan 2016 20:21:00 +0000 (21:21 +0100)
committerGeorg Ringer <georg.ringer@gmail.com>
Fri, 8 Jan 2016 04:50:35 +0000 (05:50 +0100)
The CharsetConverter previously had to be configured
to detect if mbstring or iconv or TYPO3's homemade code
via the $TYPO3_CONF_VARS options.

Since CharsetConverter is now a singleton, the check
which conversion strategy should be chosen is now done
during runtime once every request, where mbstring
takes precedence over iconv.

The feature detection in the Install Tool is removed.

Resolves: #72337
Releases: master
Change-Id: Iaa34ed9db2faec0eda9606a399541e564499baa3
Reviewed-on: https://review.typo3.org/45663
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
13 files changed:
typo3/sysext/core/Classes/Charset/CharsetConverter.php
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Documentation/Changelog/master/Feature-72337-CharsetConversionAutodetection.rst [new file with mode: 0644]
typo3/sysext/frontend/Tests/Unit/ContentObject/ContentObjectRendererTest.php
typo3/sysext/install/Classes/Configuration/Charset/CharsetFeature.php [deleted file]
typo3/sysext/install/Classes/Configuration/Charset/CoreInternalPreset.php [deleted file]
typo3/sysext/install/Classes/Configuration/Charset/CustomPreset.php [deleted file]
typo3/sysext/install/Classes/Configuration/Charset/IconvPreset.php [deleted file]
typo3/sysext/install/Classes/Configuration/Charset/MbstringPreset.php [deleted file]
typo3/sysext/install/Classes/Configuration/Context/DebugPreset.php
typo3/sysext/install/Classes/Configuration/Context/LivePreset.php
typo3/sysext/install/Classes/Configuration/FeatureManager.php
typo3/sysext/install/Classes/Service/SilentConfigurationUpgradeService.php

index ca522b5..c5b9a3c 100644 (file)
@@ -64,6 +64,13 @@ class CharsetConverter implements SingletonInterface
     const STRATEGY_FALLBACK = 'fallback';
 
     /**
+     * Set to one of the strategies above, based on the availability of the environment.
+     *
+     * @var string
+     */
+    protected $conversionStrategy = null;
+
+    /**
      * ASCII Value for chars with no equivalent.
      *
      * @var int
@@ -606,15 +613,15 @@ class CharsetConverter implements SingletonInterface
         }
         // PHP-libs don't support fallback to SGML entities, but UTF-8 handles everything
         if ($toCharset === 'utf-8' || !$useEntityForNoChar) {
-            switch ($GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_convMethod']) {
-                case 'mbstring':
+            switch ($this->getConversionStrategy()) {
+                case self::STRATEGY_MBSTRING:
                     $convertedString = mb_convert_encoding($inputString, $toCharset, $fromCharset);
                     if (false !== $convertedString) {
                         return $convertedString;
                     }
                     // Returns FALSE for unsupported charsets
                     break;
-                case 'iconv':
+                case self::STRATEGY_ICONV:
                     $convertedString = iconv($fromCharset, $toCharset . '//TRANSLIT', $inputString);
                     if (false !== $convertedString) {
                         return $convertedString;
@@ -2276,18 +2283,23 @@ class CharsetConverter implements SingletonInterface
     }
 
     /**
-     * Checks the selected strategy based on which method is configured in
-     * $TYPO3_CONF_VARS[SYS][t3lib_cs_utils].
+     * Checks the selected strategy based on which method is available in the system.
+     * "mbstring" takes precedence over "iconv".
+     * See http://stackoverflow.com/questions/8233517/what-is-the-difference-between-iconv-and-mb-convert-encoding-in-php
      *
      * @return string could be "mbstring", "iconv" or "fallback"
      */
-    protected function getConversionStrategy() {
-        if ($GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_utils'] === self::STRATEGY_MBSTRING) {
-            return self::STRATEGY_MBSTRING;
-        } elseif ($GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_utils'] === self::STRATEGY_ICONV) {
-            return self::STRATEGY_ICONV;
-        } else {
-            return self::STRATEGY_FALLBACK;
+    protected function getConversionStrategy()
+    {
+        if ($this->conversionStrategy === null) {
+            if (extension_loaded('mbstring')) {
+                $this->conversionStrategy = self::STRATEGY_MBSTRING;
+            } elseif (extension_loaded('iconv')) {
+                $this->conversionStrategy = self::STRATEGY_ICONV;
+            } else {
+                $this->conversionStrategy = self::STRATEGY_FALLBACK;
+            }
         }
+        return $this->conversionStrategy;
     }
 }
index c0d8eba..fcee59d 100644 (file)
@@ -92,8 +92,6 @@ return array(
         'mediafile_ext' => 'gif,jpg,jpeg,bmp,png,pdf,svg,ai,mp3,wav,mp4,webm,youtube,vimeo',    // Commalist of file extensions perceived as media files by TYPO3. Lowercase and no spaces between!
         'binPath' => '',                        // String: List of absolute paths where external programs should be searched for. Eg. <code>/usr/local/webbin/,/home/xyz/bin/</code>. (ImageMagick path have to be configured separately)
         'binSetup' => '',                        // String (textarea): List of programs (separated by newline or comma). By default programs will be searched in default paths and the special paths defined by 'binPath'. When PHP has openbasedir enabled the programs can not be found and have to be configured here. Example: <code>perl=/usr/bin/perl,unzip=/usr/local/bin/unzip</code>
-        't3lib_cs_convMethod' => '',            // String (values: "iconv", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset conversion functions in \TYPO3\CMS\Core\Charset\CharsetConverter. Will speed up charset conversion radically.
-        't3lib_cs_utils' => '',                    // String (values: "iconv", "mbstring", default is homemade PHP-code). Defines which of these PHP-features to use for various charset processing functions in \TYPO3\CMS\Core\Charset\CharsetConverter. Will speed up charset functions radically.
         'no_pconnect' => true,                    // Boolean: If TRUE, "connect" is used to connect to the database. If FALSE, a persistent connection using "pconnect" will be established!
         'dbClientCompress' => false,            // Boolean: if TRUE, data exchange between TYPO3 and database server will be compressed. This may improve performance if (1) database serever is on the different server and (2) network connection speed to database server is 100mbps or less. CPU usage will be higher if this option is used but database operations will be executed faster due to much less (up to 3 times) database network traffic. This option has no effect if MySQL server is localhost.
         'setDBinit' => '',                        // String (textarea): These commands are executed after the database connection was established. Hint: The previous default "SET NAMES utf8;" is not required any more and will be removed automatically if set!
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-72337-CharsetConversionAutodetection.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-72337-CharsetConversionAutodetection.rst
new file mode 100644 (file)
index 0000000..66eff8d
--- /dev/null
@@ -0,0 +1,18 @@
+==================================================
+Feature: #72337 - Charset Conversion Autodetection
+==================================================
+
+Description
+===========
+
+The Charset Converter which is used to handle multi-byte charset conversions now autodetects which conversion
+strategy - either ``mbstring``, ``iconv`` or the TYPO3-internal functionality should be used, based on the available
+PHP modules in the system.
+
+``mbstring`` takes precedence over ``iconv`` and the TYPO3-internal functionality.
+
+
+Impact
+======
+
+The options ``$TYPO3_CONF_VARS['SYS'][t3lib_cs_utils]`` and ``$TYPO3_CONF_VARS[SYS][t3lib_cs_convMethod]`` have no effect anymore and can be removed. TYPO3 chooses the best strategy at runtime.
\ No newline at end of file
index d64c8d0..9c660d9 100755 (executable)
@@ -106,7 +106,6 @@ class ContentObjectRendererTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
         $GLOBALS['TSFE'] = $this->typoScriptFrontendControllerMock;
         $GLOBALS['TT'] = new NullTimeTracker();
         $GLOBALS['TYPO3_DB'] = $this->getMock(\TYPO3\CMS\Core\Database\DatabaseConnection::class, array());
-        $GLOBALS['TYPO3_CONF_VARS']['SYS']['t3lib_cs_utils'] = 'mbstring';
 
         $this->subject = $this->getAccessibleMock(
             \TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer::class,
diff --git a/typo3/sysext/install/Classes/Configuration/Charset/CharsetFeature.php b/typo3/sysext/install/Classes/Configuration/Charset/CharsetFeature.php
deleted file mode 100644 (file)
index 3626223..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Configuration\Charset;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Install\Configuration;
-
-/**
- * Charset conversion feature
- */
-class CharsetFeature extends Configuration\AbstractFeature implements Configuration\FeatureInterface
-{
-    /**
-     * @var string Name of feature
-     */
-    protected $name = 'Charset';
-
-    /**
-     * @var array List of preset classes
-     */
-    protected $presetRegistry = array(
-        \TYPO3\CMS\Install\Configuration\Charset\MbstringPreset::class,
-        \TYPO3\CMS\Install\Configuration\Charset\IconvPreset::class,
-        \TYPO3\CMS\Install\Configuration\Charset\CoreInternalPreset::class,
-        \TYPO3\CMS\Install\Configuration\Charset\CustomPreset::class,
-    );
-}
diff --git a/typo3/sysext/install/Classes/Configuration/Charset/CoreInternalPreset.php b/typo3/sysext/install/Classes/Configuration/Charset/CoreInternalPreset.php
deleted file mode 100644 (file)
index 1fde3df..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Configuration\Charset;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Install\Configuration;
-
-/**
- * Internal core charset handling preset
- */
-class CoreInternalPreset extends Configuration\AbstractPreset
-{
-    /**
-     * @var string Name of preset
-     */
-    protected $name = 'CoreInternal';
-
-    /**
-     * @var int Priority of preset
-     */
-    protected $priority = 20;
-
-    /**
-     * @var array Configuration values handled by this preset
-     */
-    protected $configurationValues = array(
-        'SYS/t3lib_cs_convMethod' => '',
-        'SYS/t3lib_cs_utils' => '',
-    );
-
-    /**
-     * Internal core handling is always available
-     *
-     * @return bool TRUE
-     */
-    public function isAvailable()
-    {
-        return true;
-    }
-}
diff --git a/typo3/sysext/install/Classes/Configuration/Charset/CustomPreset.php b/typo3/sysext/install/Classes/Configuration/Charset/CustomPreset.php
deleted file mode 100644 (file)
index 526d847..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Configuration\Charset;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Install\Configuration;
-
-/**
- * Custom preset is a fallback if no other preset fits
- */
-class CustomPreset extends Configuration\AbstractCustomPreset implements Configuration\CustomPresetInterface
-{
-    /**
-     * @var array Configuration values handled by this preset
-     */
-    protected $configurationValues = array(
-        'SYS/t3lib_cs_convMethod' => '',
-        'SYS/t3lib_cs_utils' => '',
-    );
-}
diff --git a/typo3/sysext/install/Classes/Configuration/Charset/IconvPreset.php b/typo3/sysext/install/Classes/Configuration/Charset/IconvPreset.php
deleted file mode 100644 (file)
index aa08b4f..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Configuration\Charset;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Install\Configuration;
-
-/**
- * Iconv charset preset
- */
-class IconvPreset extends Configuration\AbstractPreset
-{
-    /**
-     * @var string Name of preset
-     */
-    protected $name = 'Iconv';
-
-    /**
-     * @var int Priority of preset
-     */
-    protected $priority = 80;
-
-    /**
-     * @var array Configuration values handled by this preset
-     */
-    protected $configurationValues = array(
-        'SYS/t3lib_cs_convMethod' => 'iconv',
-        'SYS/t3lib_cs_utils' => 'iconv',
-    );
-
-    /**
-     * Check if iconv PHP module is loaded
-     *
-     * @return bool TRUE if iconv PHP module is loaded
-     */
-    public function isAvailable()
-    {
-        $result = false;
-        if (extension_loaded('iconv')) {
-            $result = true;
-        }
-        return $result;
-    }
-}
diff --git a/typo3/sysext/install/Classes/Configuration/Charset/MbstringPreset.php b/typo3/sysext/install/Classes/Configuration/Charset/MbstringPreset.php
deleted file mode 100644 (file)
index d756a02..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-namespace TYPO3\CMS\Install\Configuration\Charset;
-
-/*
- * This file is part of the TYPO3 CMS project.
- *
- * It is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, either version 2
- * of the License, or any later version.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- * The TYPO3 project - inspiring people to share!
- */
-
-use TYPO3\CMS\Install\Configuration;
-
-/**
- * Mbstring charset preset
- */
-class MbstringPreset extends Configuration\AbstractPreset
-{
-    /**
-     * @var string Name of preset
-     */
-    protected $name = 'Mbstring';
-
-    /**
-     * @var int Priority of preset
-     */
-    protected $priority = 90;
-
-    /**
-     * @var array Configuration values handled by this preset
-     */
-    protected $configurationValues = array(
-        'SYS/t3lib_cs_convMethod' => 'mbstring',
-        'SYS/t3lib_cs_utils' => 'mbstring',
-    );
-
-    /**
-     * Check if mbstring PHP module is loaded
-     *
-     * @return bool TRUE if mbstring PHP module is loaded
-     */
-    public function isAvailable()
-    {
-        $result = false;
-        if (extension_loaded('mbstring')) {
-            $result = true;
-        }
-        return $result;
-    }
-}
index 6e13e94..a328859 100644 (file)
@@ -50,7 +50,7 @@ class DebugPreset extends Configuration\AbstractPreset
     /**
      * Development preset is always available
      *
-     * @return bool TRUE if mbstring PHP module is loaded
+     * @return bool Always TRUE
      */
     public function isAvailable()
     {
index 8689b18..fe0c763 100644 (file)
@@ -48,7 +48,7 @@ class LivePreset extends Configuration\AbstractPreset
     /**
      * Production preset is always available
      *
-     * @return bool TRUE if mbstring PHP module is loaded
+     * @return bool Always TRUE
      */
     public function isAvailable()
     {
index e2a98be..4b3e23f 100644 (file)
@@ -36,7 +36,6 @@ class FeatureManager
      * @var array List of feature class names
      */
     protected $featureRegistry = array(
-        \TYPO3\CMS\Install\Configuration\Charset\CharsetFeature::class,
         \TYPO3\CMS\Install\Configuration\Context\ContextFeature::class,
         \TYPO3\CMS\Install\Configuration\Image\ImageFeature::class,
         \TYPO3\CMS\Install\Configuration\ExtbaseObjectCache\ExtbaseObjectCacheFeature::class,
index cb95888..338b8f6 100755 (executable)
@@ -76,6 +76,9 @@ class SilentConfigurationUpgradeService
         'FE/secureFormmail',
         'FE/strictFormmail',
         'FE/formmailMaxAttachmentSize',
+        // #72337
+        'SYS/t3lib_cs_utils',
+        'SYS/t3lib_cs_convMethod',
     );
 
     /**