diff --git a/CHANGELOG b/CHANGELOG index baff9e9a3..978ef33dc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,6 @@ * 1.32.1 (2017-XX-XX) - * n/a + * fixed JS escaping for unicode characters with higher code points * 1.32.0 (2017-02-26) diff --git a/lib/Twig/Extension/Core.php b/lib/Twig/Extension/Core.php index 22824a880..0af175b4b 100644 --- a/lib/Twig/Extension/Core.php +++ b/lib/Twig/Extension/Core.php @@ -1168,8 +1168,13 @@ function _twig_escape_js_callback($matches) // \uHHHH $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8'); + $char = strtoupper(bin2hex($char)); - return '\\u'.strtoupper(substr('0000'.bin2hex($char), -4)); + if (4 >= strlen($char)) { + return sprintf('\u%04s', $char); + } + + return sprintf('\u%04s\u%04s', substr($char, 0, -4), substr($char, -4)); } function _twig_escape_css_callback($matches) diff --git a/test/Twig/Tests/Fixtures/filters/escape_javascript.test b/test/Twig/Tests/Fixtures/filters/escape_javascript.test new file mode 100644 index 000000000..647147a43 --- /dev/null +++ b/test/Twig/Tests/Fixtures/filters/escape_javascript.test @@ -0,0 +1,8 @@ +--TEST-- +"escape" filter +--TEMPLATE-- +{{ "é ♜ 𝌆"|e('js') }} +--DATA-- +return array() +--EXPECT-- +\u00E9\x20\u265C\x20\uD834\uDF06