ФорумПрограммированиеPHP для идиотов → проблемы с кодировкой

проблемы с кодировкой

  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz Окт. 4, 2010, 2:12 п.п.

    Добрый день. По книге Practical Web 2.0 Applications with PHP, by Quentin Zervaas пытаюсь сделать сайт при помощи zend framework + smarty. Проблема в следующем, когда происходит регистрация пользователя, по окончанию на почту высылается письмо с логином и паролем, так вот в этом письме вместо кириллицы, кракозяблы одни. Хотя в базе данные отображаются корректно. пример можно глянуть на wooohooo.ru

    вот индексный файл, который является точкой входа.


    
    
    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', 1);
    date_default_timezone_set('Europe/Moscow');
    
    //путь до установленного фреймворка
    set_include_path('.'.PATH_SEPARATOR . '../libs'
        .PATH_SEPARATOR.'../libs/Pear'
        .PATH_SEPARATOR.get_include_path());
        
        
    require_once 'Zend/Loader/Autoloader.php';
    $loader = Zend_Loader_Autoloader::getInstance();
    $loader->registerNamespace(array('CustomControllerAclManager', 'Templater', 'CustomControllerAction'
                                , 'DatabaseObject', 'FormProcessor', 'Profile','Text_CAPTCHA'
                                ,'Text_Password'));
    
    
    //загрузка конфигурационной информации
    $config=new Zend_Config_Ini('../settings.ini','development');
    Zend_Registry::set('config',$config);
    
    //создание обьекта для системного журнала
    $logger=new Zend_Log(new Zend_Log_Writer_Stream($config->logging->file));
    Zend_Registry::set('logger',$logger);
    
    //соединение с базой данных
    $params = array('host' => $config->database->hostname,
            'username' => $config->database->username,
            'password' => $config->database->password,
            'dbname'   => $config->database->database,
    		'driver_options'=> array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'),
            'profiler'      => false);
    
    
    $db = Zend_Db::factory($config->database->type, $params);
    Zend_Registry::set('db', $db);
    $db->query("set names utf8");
    
    //настройка аутентификации пользователей
    $auth = Zend_Auth::getInstance();
    $auth->setStorage(new Zend_Auth_Storage_Session());
    
    //обработка запроса пользователя
    $controller=Zend_Controller_Front::getInstance();
    $controller->throwExceptions(true);
    $controller->setControllerDirectory($config->paths->base.'/include/Controllers/');
    $controller->registerPlugin(new CustomControllerAclManager($auth));
    
    //настройка визуализации
        $vr = new Zend_Controller_Action_Helper_ViewRenderer();
        $vr->setView(new Templater());
        $vr->setViewSuffix('tpl');
        Zend_Controller_Action_HelperBroker::addHelper($vr);
    
    
    $controller->throwExceptions(true);
    $controller->dispatch();
    
    



    вот содержимое файлы user

    <?php
        class DatabaseObject_User extends DatabaseObject
        {
            static $userTypes = array('member'        => 'Member',
                                      'administrator' => 'Administrator');
    
            public $profile = null;
            public $_newPassword = null;
    
            public function __construct($db)
            {
                parent::__construct($db, 'users', 'user_id');
    
                $this->add('username');
                $this->add('password');
                $this->add('user_type', 'member');
                $this->add('ts_created', time(), self::TYPE_TIMESTAMP);
                $this->add('ts_last_login', null, self::TYPE_TIMESTAMP);
    
                $this->profile = new Profile_User($db);
            }
    
            protected function preInsert()
            {
     //           $this->password = uniqid();
                $this->_newPassword = Text_Password::create(8);
                $this->password = $this->_newPassword;
                return true;
            }
    
            protected function postLoad()
            {
                $this->profile->setUserId($this->getId());
                $this->profile->load();
            }
    
            protected function postInsert()
            {
                $this->profile->setUserId($this->getId());
                $this->profile->save(false);
                $this->sendEmail('user-register.tpl');
                return true;
            }
    
            protected function postUpdate()
            {
                $this->profile->save(false);
                return true;
            }
    
            protected function preDelete()
            {
                $this->profile->delete();
                return true;
            }
    
            public function __set($name, $value)
            {
                switch ($name) {
                    case 'password':
                        $value = md5($value);
                        break;
    
                    case 'user_type':
                        if (!array_key_exists($value, self::$userTypes))
                            $value = 'member';
                        break;
                }
    
                return parent::__set($name, $value);
            }
            
            
            public function usernameExists($username)
            {
                $query = sprintf('select count(*) from %s where username = ?',
                                 $this->_table);
    
                $result = $this->_db->fetchOne($query, $username);
    
                return $result > 0;
            }
    
            static public function IsValidUsername($username)
            {
                $validator = new Zend_Validate_Alnum();
                return $validator->isValid($username);
            }
            
            
             public function sendEmail($tpl)
            {
                $templater = new Templater();
                $templater->user = $this;
    
                // считывается тело сообщения
                $body = $templater->render('email/' . $tpl);
    
                // извлечение темы из первой строки
                list($subject, $body) = preg_split('/\r|\n/', $body, 2);
    
                // настройка и отправка сообщения
                $mail = new Zend_Mail();
    
                // помещение адреса доставки и полного имени в строку "кому"
                $mail->addTo($this->profile->email,
                             trim($this->profile->first_name . ' ' .
                                  $this->profile->last_name));
    
                // чтение данных администратора из конфигурационной информации
                $mail->setFrom(Zend_Registry::get('config')->email->from->email,
                Zend_Registry::get('config')->email->from->name);
    
                // добавление темы и тела, отправки
                $mail->setSubject(trim($subject));
                $mail->setBodyText(trim($body));
                $mail->send();
            }
            
        }
    ?>
    


    в чем проблема? где я не доуказал, что используется utf-8 кодировка? база данных в кодировке utf-8, файлы пхп тоже в ней. В заранее благоддарен
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz Окт. 4, 2010, 2:14 п.п., спустя 2 минуты 23 секунды

    // помещение адреса доставки и полного имени в строку "кому"

    это утф8? :D
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Окт. 4, 2010, 2:15 п.п., спустя 1 минуту

    mario, да.
    Сапожник без сапог
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz Окт. 4, 2010, 2:17 п.п., спустя 1 минуту 49 секунд

    содержимое файла шаблона.
    {$user->profile->first_name}, Спасибо за регистрацию.
    Уважаемый  {$user->profile->first_name},
    
    Регистрация выполнена успешно. Детали Вашего аккаунта:
    
       Форма входа:  http://wooohooo.ru/account/login
       Логин: {$user->username}
        Пароль:  {$user->_newPassword}
    
    С уважением,
    
    Администрация wooohooo.ru


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


    Спустя 44 сек.

    // помещение адреса доставки и полного имени в строку "кому"

    это утф8? :D


    это я на всякий случай файл, несколько раз кодировку менял, и разок перекодировать галочку не поставил, а просто изменил кодировку.
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz Окт. 4, 2010, 2:24 п.п., спустя 6 минут 52 секунды

    а так прочтите вот это http://framework.zend.com/manual/en/zend.mail.html
    особенно часть про кодировки (Encoding)
    Спустя 46 сек.

    mario, да.
    а разве не коир? ) или я что то уже путаю….
    Спустя 129 сек.
    попробуйте явно указать кодировку.
    Спустя 57 сек.
     public function sendEmail($tpl)
            {
                $templater = new Templater();
                $templater->user = $this;
     
                // считывается тело сообщения
                $body = $templater->render('email/' . $tpl);
     
                // извлечение темы из первой строки
                list($subject, $body) = preg_split('/\r|\n/', $body, 2);
     
                // настройка и отправка сообщения
                $mail = new Zend_Mail('UTF-8'); 
    …
    Спустя 136 сек.
    а еще может быть проблема на стороне клиента (хотя я тут очень сильно могу ошибаться)
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz Окт. 4, 2010, 2:25 п.п., спустя 1 минуту 18 секунд

    http://framework.zend.com/manual/en/zend.mail.html

    да, спасибо большое, проблему решил, как раз прочтя это http://framework.zend.com/manual/en/zend.mail.html
    сейчас лишь появились ???? в поле откого, но это я грешу на не верный формат файла конфига, где хранится эта надпись, сейчас его подправлю, и надеюсь все заработает)

  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz Окт. 4, 2010, 2:34 п.п., спустя 9 минут 12 секунд

    только странно, у автора письма появилось "=?UTF-8?Q??="

    хотя данные о авторе хранятся в файле конфига

    [development]

    email.from.name="Администрация wooohooo.ru"
    email.from.email="administrator@wooohooo.ru"
  • ArhiISP

    Сообщения: 15 Репутация: N Группа: Кто попало

    Spritz Окт. 4, 2010, 2:42 п.п., спустя 8 минут 20 секунд

    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
  • mario

    Сообщения: 6067 Репутация: N Группа: Джедаи

    Spritz Окт. 4, 2010, 2:48 п.п., спустя 5 минут 18 секунд


    а все, и это решилось, если кому интересно, необходимо было добавить $mail->setHeaderEncoding(Zend_Mime::ENCODING_BASE64);
    как нистранно там:
    особенно часть про кодировки (Encoding)

    это написано )))

Пожалуйста, авторизуйтесь, чтобы написать комментарий!