diff --git a/src/Extension/EscaperExtension.php b/src/Extension/EscaperExtension.php index 68adf8c2e..eebdc3a4e 100644 --- a/src/Extension/EscaperExtension.php +++ b/src/Extension/EscaperExtension.php @@ -282,7 +282,7 @@ function twig_escape_filter(Environment $env, $string, $strategy = 'html', $char 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/Extension/EscaperTest.php b/tests/Extension/EscaperTest.php index b7ec4065b..cf62dd1e2 100644 --- a/tests/Extension/EscaperTest.php +++ b/tests/Extension/EscaperTest.php @@ -182,6 +182,22 @@ class Twig_Tests_Extension_EscaperTest extends 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() { $twig = new Environment($this->createMock(LoaderInterface::class));