Symfony\Polyfill\Mbstring

Mbstring::mb_convert_encoding │ public static │ CF7 1.0

Метод класса: Mbstring{}

Хуков нет.

Возвращает

null. Ничего (null).

Использование

$result = Mbstring::mb_convert_encoding( $s, $toEncoding, $fromEncoding );
$s(обязательный)
.
$toEncoding(обязательный)
.
$fromEncoding
.
По умолчанию: null

Код Mbstring::mb_convert_encoding() CF7 6.2.4.1

public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
{
    if (\is_string($fromEncoding) && 2 < \strlen($fromEncoding) && '"' === $fromEncoding[0] && '"' === $fromEncoding[-1]) {
        $fromEncoding = substr($fromEncoding, 1, -1);
    }

    if (80000 <= \PHP_VERSION_ID
        && (!isset(self::$convertibleEncodings[$toEncoding]) || (null !== $fromEncoding && !(\is_string($fromEncoding) && isset(self::$convertibleEncodings[$fromEncoding]))))
        && null !== $error = self::getConversionError('mb_convert_encoding', 2, $toEncoding, $fromEncoding)
    ) {
        throw new \ValueError($error);
    }

    if (\is_array($s)) {
        return self::convertArray($s, $toEncoding, $fromEncoding);
    }

    if (\is_array($fromEncoding) || (null !== $fromEncoding && false !== strpos($fromEncoding, ','))) {
        $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
    } else {
        $fromEncoding = self::getEncoding($fromEncoding);
    }

    $toEncoding = self::getEncoding($toEncoding);

    if ('BASE64' === $fromEncoding) {
        $s = base64_decode($s);
        $fromEncoding = $toEncoding;
    }

    if ('BASE64' === $toEncoding) {
        return base64_encode($s);
    }

    if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
        if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
            $fromEncoding = 'Windows-1252';
        }
        if ('UTF-8' !== $fromEncoding) {
            $s = self::iconv($fromEncoding, 'UTF-8', $s);
        } elseif (!preg_match('//u', $s)) {
            $s = self::scrubUtf8($s);
        }

        return preg_replace_callback('/[\x80-\xFF]+/', [__CLASS__, 'html_encoding_callback'], $s);
    }

    if ('HTML-ENTITIES' === $fromEncoding) {
        $decodeControlChars = static function ($m) {
            $code = '' !== ($m[2] ?? '') ? hexdec($m[2]) : (int) $m[1];

            if ($code < 32 || 127 === $code) {
                return \chr($code);
            }
            if (128 <= $code && $code <= 159) {
                return "\xC2".\chr(0x80 | ($code & 0x3F));
            }

            return $m[0];
        };

        if (\PHP_VERSION_ID >= 70400) {
            $s = html_entity_decode($s, \ENT_QUOTES, 'UTF-8');
            // html_entity_decode() leaves numeric entities for C0/C1 control
            // characters as-is (HTML spec), but mb_convert_encoding() decodes
            // them. Catch what html_entity_decode() missed.
            if (false !== strpos($s, '&#')) {
                $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s);
            }
        } else {
            // PHP < 7.4: html_entity_decode() truncates strings at NUL bytes,
            // so decode the control character entities first then call
            // html_entity_decode() on each NUL-delimited chunk independently.
            $s = preg_replace_callback('/&#(?:0*([0-9]++)|[xX]0*([0-9a-fA-F]++));/', $decodeControlChars, $s);
            $s = implode("\0", array_map(static function ($chunk) {
                return html_entity_decode($chunk, \ENT_QUOTES, 'UTF-8');
            }, explode("\0", $s)));
        }
        $fromEncoding = 'UTF-8';
    }

    if ('UTF-8' === $fromEncoding && !preg_match('//u', $s)) {
        $s = self::scrubUtf8($s);
    }

    return self::iconv($fromEncoding, $toEncoding, $s);
}