From 06227c7075c1312974baf9062d87d502f003ae32 Mon Sep 17 00:00:00 2001 From: Nikolay Oleynikov Date: Tue, 20 Nov 2018 01:09:03 +0300 Subject: [PATCH] Fixes #16648: Html::strtolower() was corrupting UTF-8 strings --- framework/CHANGELOG.md | 1 + framework/helpers/BaseHtml.php | 3 +- tests/framework/helpers/HtmlTest.php | 52 ++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index e348d9bc34..fa67dea0ff 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -4,6 +4,7 @@ Yii Framework 2 Change Log 2.0.16 under development ------------------------ +- Bug #16648: Html::strtolower() was corrupting UTF-8 strings (Kolyunya) - Bug #13977: Skip validation if file input does not exist (RobinKamps, s1lver) - Bug #16183: Fixed when `yii\helpers\BaseFileHelper` sometimes returned wrong value (samdark, SilverFire, OndrejVasicek) - Bug #13932: Fix number validator attributes comparison (uaoleg, s1lver) diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 911bda6ff7..5b0440b291 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -2295,7 +2295,8 @@ class BaseHtml */ public static function getInputId($model, $attribute) { - $name = strtolower(static::getInputName($model, $attribute)); + $charset = Yii::$app ? Yii::$app->charset : 'UTF-8'; + $name = mb_strtolower(static::getInputName($model, $attribute), $charset); return str_replace(['[]', '][', '[', ']', ' ', '.'], ['', '-', '-', '', '-', '-'], $name); } diff --git a/tests/framework/helpers/HtmlTest.php b/tests/framework/helpers/HtmlTest.php index 5f6c81227e..8e1846e10a 100644 --- a/tests/framework/helpers/HtmlTest.php +++ b/tests/framework/helpers/HtmlTest.php @@ -1778,6 +1778,19 @@ EOD; $this->assertSame($expected, $actual); } + /** + * @dataProvider testGetInputIdDataProvider + */ + public function testGetInputId($attributeName, $inputIdExpected) + { + $model = new DynamicModel(); + $model->defineAttribute($attributeName); + + $inputIdActual = Html::getInputId($model, $attributeName); + + $this->assertSame($inputIdExpected, $inputIdActual); + } + public function testEscapeJsRegularExpression() { $expected = '/[a-z0-9-]+/'; @@ -1858,6 +1871,45 @@ HTML; $this->assertContains('placeholder="My placeholder: Name"', $html); } + + public function testGetInputIdDataProvider() + { + return [ + [ + 'foo', + 'dynamicmodel-foo', + ], + [ + 'FooBar', + 'dynamicmodel-foobar', + ], + [ + 'Foo_Bar', + 'dynamicmodel-foo_bar', + ], + [ + 'foo[]', + 'dynamicmodel-foo', + ], + [ + 'foo[bar][baz]', + 'dynamicmodel-foo-bar-baz', + ], + + [ + 'foo.bar', + 'dynamicmodel-foo-bar', + ], + [ + 'bild_groß_dateiname', + 'dynamicmodel-bild_groß_dateiname', + ], + [ + 'ФуБарБаз', + 'dynamicmodel-фубарбаз', + ], + ]; + } } /**