Invalid Multibyte Sequence In Argument

всем привет

столкнулся с непоняткой: при использовании связки CArrayDataProvider + zii.widgets.CListView = получил такой отлуп = [color="#FF0000"]htmlspecialchars() [<a href=‘function.htmlspecialchars’>function.htmlspecialchars</a>]: Invalid multibyte sequence in argument[/color]

в массиве который подается в датапровайдер - кириллица

стоит ее поменять на латиницу - все работает без проблем

что за фигня? почему возникает и как лечить?

p.s. неужели массив энкодировать?! :o

p.s.2 таблица в БД - utf8

Не, не надо ничего энкодировать.

Эта штука может появляться либо из-за косячных данных в БД, либо из-за косячной версии php (в 5.3.19 был такой баг, уже пофиксили)

Ну и на всякий случай проверьте, что в конфиге


'db' => array(

    ...

    'charset' => 'utf8',

),

так и есть =


'charset' => 'utf8',

менял массив из БД на рукопашный массив с кириллицей = та же ошибка = видимо дело в версии php

Обновляйтесь… По идее, есть способ заткнуть фонтан красноречия php - вот так примерно


htmlspecialchars('текст текст текст', ENT_COMPAT, 'UTF-8');

но как бы не пришлось для этого править сорцы (что не есть гуд)

а вот и не помогло…

обновился с 5.3.8 до 5.3.27 — та же ошибка

попробовал вместо CArrayDataProvider использовать CSqlDataProvider = все проканало без проблем…

как так могет быть?

Как сказал oRey - обновляйтесь, только на 5.4




htmlspecialchars('текст текст текст', ENT_COMPAT, 'UTF-8');



Именно это и нужно делать, в 5.4 3й параметр по дэфолту UTF-8, а вот в 5.3.27 он ISO-8859-1, вот и выдает вам ошибку.

Да и давно пора переходить уже, трэйты там, производительность и прочее. Кстати ради рекламы - после апдейта нагрузка на инстансах упала на 25% в среднем, так что стоит задуматься.

Переходить-то давно пора, да только с шаред-хостинг провайдерами беда.

Сейчас пока на локуме сижу, если знаете рекомендованных - дайте ссылок чтоль.

Список samdark-а видел.

дальше еще интереснее: решил попробовать использовать encodeArray из CHtml

для этого создал в компонентсах класс унаследованный от CHtml и там перегрузил этот метод

в котором использовал


htmlspecialchars($key,ENT_QUOTES|ENT_IGNORE,'UTF-8')

не помогло…

тогда пошел в рукопашную и вбил массив прямо в CArrayDataProvider и тут случилось крайне интересное…

так - [color="#FF0000"]работает[/color] =


        $dataProvider=new CArrayDataProvider(

                array(

                    'key'=>htmlspecialchars('it work = english words and letters', ENT_COMPAT, 'UTF-8')

                    ), array(

            'pagination'=>array(

                'pageSize'=>10,

            ),

        ));

так - [color="#0000FF"]не работает[/color] =


        $dataProvider=new CArrayDataProvider(

                array(

                    'key'=>htmlspecialchars('здесь текст на русском', ENT_COMPAT, 'UTF-8')

                    ), array(

            'pagination'=>array(

                'pageSize'=>10,

            ),

        ));

а так - [color="#FF0000"]СНОВА работает[/color] =


        $dataProvider=new CArrayDataProvider(

                array(

                    'key'=>htmlspecialchars('it isn`t work = здесь текст на русском', ENT_COMPAT, 'UTF-8')

                    ), array(

            'pagination'=>array(

                'pageSize'=>10,

            ),

        ));

не понимаю - каким образом наличие в строке нескольких латинских символов меняет принцип работы?

Это может быть как-то связано с BOM? Иногда, если файлы проекта (или хотя бы один) находятся в кодировке utf8 (с BOM), то случаются странные вещи, по крайней мере, у меня :) Но это предположение из разряда “пальцем в небо”.

хз… не могу прокомментировать…

обычно если есть БОМ - то так и вылезает предупреждение…

с другой стороны CSqlDataProvider работает без проблем = ему пофиг кириллица

а CArrayDataProvider = кобенится

и потом = я же врукопашную фигачу провайдеры прямо в контроллере = какой-тут может быть БОМ ?

вывод же в представлении

Хмм.

Если убрать датапровайдеры и всё с ними связанное, и тупо попробовать

echo htmlspecialchars(‘it work = english words and letters’, ENT_COMPAT, ‘UTF-8’);

echo htmlspecialchars(‘здесь текст на русском’, ENT_COMPAT, ‘UTF-8’);

echo htmlspecialchars(‘it isn`t work = здесь текст на русском’, ENT_COMPAT, ‘UTF-8’);

что получится?

все работает без проблем и в любых вариациях = в браузер выводится

p.s. во блин замутил

Ну стало быть с пхп всё ок, и надо копать датапровайдер в поисках места, где он там косячить начинает, а потом сабмитить багу, ибо крутая.

Важное примечание: эта фигня здорово зависит от error_reporting, так что следите, чтобы он там не был выключен.

А что выводит Yii::app()->charset?

Ну encode выглядит вот так




public static function encode($text)

{

    return htmlspecialchars($text,ENT_QUOTES,Yii::app()->charset);

} 



Так что лезть не придется. Разве что для ENT_IGNORE.




$dataProvider=new CArrayDataProvider(

                array(

                    'key'=>htmlspecialchars('it isn`t work = здесь текст на русском', ENT_COMPAT, 'UTF-8')

                    ), array(

            'pagination'=>array(

                'pageSize'=>10,

            ),

        ));



А как вы собственно выводите это все?

Попробовал на 5.4 - все работает. Пробовал так:




$dataProvider=new CArrayDataProvider(

                array(

                    'key'=>' текст'

                    ), array(

            'pagination'=>false,

            'keyField'=>false

        ));

      echo $dataProvider->rawData['key'];



Код виджета с выводом в студию пожалуйста.

выводит UTF-8

вывожу через zii.widgets.CListView который расположен в виде

соответственно у него есть itemView

вопрос: какая разница может быть для CListView между датапровайдером от CArrayDataProvider и от CSqlDataProvider?

но у меня-то не 5.4, а 5.3.27

даже и незнаю что показать - ибо процесс еще тестируется И сейчас я уже отказался от CArrayDataProvider и перешел на CSqlDataProvider

вот что в виде =


$this->widget('zii.widgets.CListView', array(	

    'dataProvider'=>$dataProvider,	

    'itemView'=>'page_test_view',

));

вот что в itemView =


echo "<pre>";

print_r($data);

echo "</pre>";

ну и вот что в контроллере =


$count=count($rawData);

$dataProvider=new CSqlDataProvider($rawData, array(

	'keyField'=>'id_page',

	'totalItemCount'=>$count,

	'pagination'=>array(

		'pageSize'=>3,

	),

));                


$this->render('page_test',array(

	'datas'=>$this->data,

	'dataProvider'=>$dataProvider,

));

Просто думал что где то используется purifier, но нет. Переходите на 5.4 и будет счастье, тем более что давно уже пора.

[color="#FF0000"]yum update php[/color] смог обновить только до 5.3.27

а ковыряться со сторонними репозиториями - пока недосуг

может в отпуске…

Ага, там надо yum install, заодно и апач до 2.4, хотя и на 2.2 работает но нужно немного повозиться.

Конфиги придется немного поправить, и расширения лучше сразу ставить.

ё-кэ-лэ-мэ-нэ!

а песня-то = длинная… к новому php и апач надо новый или лезть в конфиги

p.s. все у этих программистов через задницу :)

кстати — вы-то сами как обновляли?