config->getConfig('web')->get('charset')); } catch (Exception\ConfigException $e) { $charset = 'UTF-8'; } ini_set('default_charset', $charset); // Enable mbstring if it is provided if (extension_loaded('mbstring')) { define('MBEnabled', true); mb_internal_encoding($charset); mb_substitute_character('none'); } else define('MBEnabled', false); // Enable iconv if it is provided if (extension_loaded('iconv')) { define('ICONVEnabled', true); ini_set('default_encoding', $charset); } else define('ICONVEnabled', false); // Set some global values ini_set('php.internal_encoding', $charset); if (defined('PREG_BAD_UTF8_ERROR') && (ICONVEnabled || MBEnabled) && $charset === 'UTF-8') { self::$isEnabled = true; Logger::logInfo('UTF-8 support has been enabled'); } else { self::$isEnabled = false; Logger::logInfo('UTF-8 support has not been enabled'); } } /** * Clean UTF-8 strings * * Ensures strings contain only valid UTF-8 characters. * * @param string $str String to clean * @return string */ public static function cleanString(string $str): string { if (self::isAscii($str) === false) { if (MBEnabled) $str = mb_convert_encoding($str, 'UTF-8', 'UTF-8'); elseif (ICONVEnabled) $str = @iconv('UTF-8', 'UTF-8//IGNORE', $str); } return $str; } /** * Convert to UTF-8 * * Attempts to convert a string to UTF-8. * * @param string $str * @param string $encoding * @return bool|string */ public static function convertToUtf8(string $str, string $encoding) { if (MBEnabled) return mb_convert_encoding($str, 'UTF-8', $encoding); elseif (ICONVEnabled) return @iconv($encoding, 'UTF-8', $str); return false; } /** * Is ASCII? * * Tests if a string is standard 7-bit ASCII or not. * * @param string $str String to check * @return bool */ public static function isAscii(string $str): bool { return (preg_match('/[^\x00-\x7F]/S', $str) === 0); } /** * Remove Invisible Characters * * This prevents sandwiching null characters * between ascii characters, like Java\0script. * * @param string * @param bool * @return string */ public static function removeInvisibleCharacters($str, $urlEncoded = true): string { // First determine which characters are invisible if ($urlEncoded) $nonDisplayable = ['/%0[0-8bcef]/', '/%1[0-9a-f]/']; else $nonDisplayable = []; $nonDisplayable[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; do { $str = preg_replace($nonDisplayable, '', $str, -1, $count); } while($count); return $str; } }