From da24c9340e9c4fe26ff0e55aec196ab4f3de6bb3 Mon Sep 17 00:00:00 2001 From: Oleg Stepanischev Date: Wed, 7 Jul 2021 18:27:54 +0300 Subject: [PATCH] Explicitly specify the encoding for mb_ord in JS escaper Explicitly specify the encoding for mb_ord in JS escaper - fix --- src/Extension/CoreExtension.php | 2 +- tests/escapingTest.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Extension/CoreExtension.php b/src/Extension/CoreExtension.php index 6ac222a1e..e64696b4e 100644 --- a/src/Extension/CoreExtension.php +++ b/src/Extension/CoreExtension.php @@ -1237,7 +1237,7 @@ function _twig_escape_js_callback($matches) return $shortMap[$char]; } - $codepoint = mb_ord($char); + $codepoint = mb_ord($char, 'UTF-8'); if (0x10000 > $codepoint) { return sprintf('\u%04X', $codepoint); } diff --git a/tests/escapingTest.php b/tests/escapingTest.php index ac8bcdd31..a35ce9ab1 100644 --- a/tests/escapingTest.php +++ b/tests/escapingTest.php @@ -177,6 +177,22 @@ class escapingTest extends \PHPUnit\Framework\TestCase } } + public function testJavascriptEscapingConvertsSpecialCharsWithInternalEncoding() + { + $twig = new Environment($this->createMock(LoaderInterface::class)); + $previousInternalEncoding = mb_internal_encoding(); + try { + mb_internal_encoding('ISO-8859-1'); + foreach ($this->jsSpecialChars as $key => $value) { + $this->assertEquals($value, twig_escape_filter($twig, $key, 'js'), 'Failed to escape: ' . $key); + } + } finally { + if ($previousInternalEncoding !== false) { + mb_internal_encoding($previousInternalEncoding); + } + } + } + public function testJavascriptEscapingReturnsStringIfZeroLength() { $this->assertEquals('', twig_escape_filter($this->env, '', 'js'));