Нужно ли приложению Zend Framework mbstring для поддержки UTF8? - PullRequest
1 голос
/ 20 августа 2010

Я создаю веб-приложение в Zend Framework, которому требуется поддержка UTF8 для всех языков. Кажется, это работает нормально, за исключением таких функций, как полоски и тому подобное.

На этом URL они говорят об использовании MBSTRING http://developer.loftdigital.com/blog/php-utf-8-cheatsheet

Необходимо ли использовать mbstring на моем сервере и заменить ВСЕ вхождения функций, не способных к UTF8, на их вариант MB?

Разве Zend Framework не поддерживает UTF8? Если нет, мы должны были бы заменить все функции в ZF-коде на их альтернативы mb_, верно? Это невыполнимая задача, потому что обновление до нового ZF нарушило бы наш код.

mail()      -> mb_send_mail()
strlen()    -> mb_strlen()  
strpos()    -> mb_strpos()
strrpos()   -> mb_strrpos()
substr()    -> mb_substr()
strtolower()    -> mb_strtolower()
strtoupper()    -> mb_strtoupper()
substr_count()  -> mb_substr_count()
ereg()      -> mb_ereg()
eregi()     -> mb_eregi()
ereg_replace()  -> mb_ereg_replace()
eregi_replace() -> mb_eregi_replace()   
split()     -> mb_split()

Что вы посоветуете по этому поводу, я могу быть совершенно не прав? Я читал об использовании:

mbstring.func_overload  = 7 ;

для автоматической перегрузки всех функций.

Это сломает существующее приложение, которому не нужен UTF8, или оно "изящно" деградирует? *

Ответы [ 3 ]

3 голосов
/ 20 августа 2010

Я не думаю, что перегрузка всех функций с помощью mb_string была бы хорошей, мы все знаем, что PHP не обрабатывает utf8 изначально, поэтому мы используем что-то вроде

"SET NAMES utf8" для базы данных, и мыиспользуйте Zendmail + передать кодировку ему в качестве параметра, чтобы позволить Zend mail самостоятельно управлять им внутренне

другой пример - Zend_Validate_StringLength он имеет параметр с именем encoding и использует iconv в функции с именем:

 public function setEncoding($encoding = null)
    {
        if ($encoding !== null) {
            $orig   = iconv_get_encoding('internal_encoding');
            $result = iconv_set_encoding('internal_encoding', $encoding);
            if (!$result) {
                require_once 'Zend/Validate/Exception.php';
                throw new Zend_Validate_Exception('Given encoding not supported on this OS!');
            }

            iconv_set_encoding('internal_encoding', $orig);
        }

        $this->_encoding = $encoding;
        return $this;
    }

но вы всегда будете использовать mb_string в своем приложении в какой-то логике, не связанной с фреймворком.

например, вчера я сортировал массив записей и комментариев utf8 из базы данных

я не смог бы выполнить работу без использования строки mb, потому что php не обрабатывает utf8 изначально :(

я люблю строку mb, это сделало мою жизнь проще

РЕДАКТИРОВАТЬ: что я хотел сказать, так это использовать mbstring всякий раз, когда вам это нужно, и позволить фреймворку управлять самим собой, мне не нравится автоматическая перегрузка всех функций.

3 голосов
/ 22 августа 2010

Не, и я могу только повторить, не используйте перегрузку mbstring.Это наверняка сломает любой метод, который, например, полагается на strlen (), возвращающий количество байтов.Все компоненты в Zend Framework ожидают UTF-8 по умолчанию, но могут обрабатывать разные кодировки, если вы скажете это.Это делается с помощью iconv_ *, который встроен в PHP по умолчанию, поэтому нет никаких зависимостей от дополнительных библиотек, таких как mbstring.

Единственное, что вы должны были сообщить Zend Framework о UTF-8, это подключение к базе данных, что вы можете просто сделать с помощью опции charset (см. документацию Zend_Db или Zend_Application).Вы также наверняка хотите сообщить пользовательскому агенту, какую кодировку вы доставляете, через заголовок типа контента.И не забудьте добавить accept-charset = "utf-8" в ваши теги.

1 голос
/ 20 августа 2010

Разве Zend Framework не поддерживает поддержка UTF8?

Я не знаю. Просто выполните поиск кода для поиска strlen, например, но вам все равно нужно будет посмотреть на код, чтобы определить, используется ли он в контексте, который не является многобайтовым. Быстрый поиск в Google показал это http://www.iezzi.ch/archives/371, поэтому кажется, что ZF подготовлен для приложений UTF8.

Что вы посоветуете по этому поводу? совершенно неправильно в этом? Я читаю о используя: mbstring.func_overload = 7; Это сломает существующий приложение, которое не нуждается в UTF8 или это «изящно деградирует»?

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

...