Browse Source

Merge pull request #10592 from andrewnester/10574-compatible-fix

#10574 - (2.0.x compatible)  Fix for BaseArrayHelper::encode to work with invalid characters in proper way
tags/2.0.7
Dmitry Naumenko 9 years ago
parent
commit
e58c1c1b42
  1. 6
      framework/helpers/BaseArrayHelper.php
  2. 9
      tests/framework/helpers/ArrayHelperTest.php

6
framework/helpers/BaseArrayHelper.php

@ -467,15 +467,15 @@ class BaseArrayHelper
public static function htmlEncode($data, $valuesOnly = true, $charset = null) public static function htmlEncode($data, $valuesOnly = true, $charset = null)
{ {
if ($charset === null) { if ($charset === null) {
$charset = Yii::$app->charset; $charset = Yii::$app ? Yii::$app->charset : 'UTF-8';
} }
$d = []; $d = [];
foreach ($data as $key => $value) { foreach ($data as $key => $value) {
if (!$valuesOnly && is_string($key)) { if (!$valuesOnly && is_string($key)) {
$key = htmlspecialchars($key, ENT_QUOTES, $charset); $key = htmlspecialchars($key, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
} }
if (is_string($value)) { if (is_string($value)) {
$d[$key] = htmlspecialchars($value, ENT_QUOTES, $charset); $d[$key] = htmlspecialchars($value, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
} elseif (is_array($value)) { } elseif (is_array($value)) {
$d[$key] = static::htmlEncode($value, $valuesOnly, $charset); $d[$key] = static::htmlEncode($value, $valuesOnly, $charset);
} else { } else {

9
tests/framework/helpers/ArrayHelperTest.php

@ -443,7 +443,8 @@ class ArrayHelperTest extends TestCase
[ [
'<>' => 'a<>b', '<>' => 'a<>b',
'23' => true, '23' => true,
] ],
'invalid' => "a\x80b",
]; ];
$this->assertEquals([ $this->assertEquals([
'abc' => '123', 'abc' => '123',
@ -453,7 +454,8 @@ class ArrayHelperTest extends TestCase
[ [
'<>' => 'a&lt;&gt;b', '<>' => 'a&lt;&gt;b',
'23' => true, '23' => true,
] ],
'invalid' => 'a<EFBFBD>b',
], ArrayHelper::htmlEncode($array)); ], ArrayHelper::htmlEncode($array));
$this->assertEquals([ $this->assertEquals([
'abc' => '123', 'abc' => '123',
@ -463,7 +465,8 @@ class ArrayHelperTest extends TestCase
[ [
'&lt;&gt;' => 'a&lt;&gt;b', '&lt;&gt;' => 'a&lt;&gt;b',
'23' => true, '23' => true,
] ],
'invalid' => 'a<EFBFBD>b',
], ArrayHelper::htmlEncode($array, false)); ], ArrayHelper::htmlEncode($array, false));
} }

Loading…
Cancel
Save