Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Графика > проблема с кодировкой на картинки


Автор: 4epT 11.12.2008, 23:57
Добрый вечер!
у меня по заданию нужно сделать CaptchaTest(тоесть, как на многих сайтах генерируется картинка с случайными символами и нужно ввести эти символы ....) я все реализовал, но у меня по заданию должны генерироваться русские буквы ... а генерируются черт знает что ... проблема явно в кодировке, нигде не смог найти как это исправить! подскажие пожалуйста! Ниже приведены все коды программы ....

CaptchaSecurityImages.php
Код

<?php
session_start();

class CaptchaSecurityImages {

    //var $font = '/www_host/hosts/venom.z16.ru/methods/monofont.ttf';   //тут надо полный путь к шрифту прописать,если не работает
    //var $font = 'MTCORSVA.TTF';   //тут надо полный путь к шрифту прописать,если не работает
    //var $font = 'times.ttf';   //тут надо полный путь к шрифту прописать,если не работает
    var $font = 'GOTHIC.TTF';

    function generateCode($characters) {        
        /* генерация кода */
        $possible = 'ячсмит';
        $code = '';
        $i = 0;
        while ($i < $characters) {
            $code.= substr($possible, mt_rand(0, strlen($possible)-1), 1);
            $i++;
        }
        return $code;
    }

    function CaptchaSecurityImages($width='20',$height='40',$characters='6') {
        $code = $this->generateCode($characters);                
        //$code = 'Malahov';
        $font_size = 11;        
        $image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
        //цвета
        $background_color = imagecolorallocate($image, 249, 213, 184);
        $text_color = imagecolorallocate($image, 252, 0, 243);
        $noise_color = imagecolorallocate($image, 255, 255, 255);
        /* генерируем случайные точки на фоне */
        for( $i=0; $i<($width*$height)/3; $i++ ) {
            imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
        }
        /* генерируем случайные линии на фоне */
        for( $i=0; $i<($width*$height)/150; $i++ ) {
            imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
        }        
        /* создаем некстовое поле и добавляем текст */
        $textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
        $x = ($width - $textbox[4])/2;
        $y = ($height - $textbox[5])/2;        
        imagettftext($image, $font_size, -30, $x, $y, $text_color, $this->font , $code) or die('Error in imagettfbbox function');

        /* ввыводим captcha в браузер */        
        header('Content-Type: image/jpeg');                
        imagejpeg($image);        
        imagedestroy($image);
        $_SESSION['security_code'] = $code; //проверочный код
    }

}

$width = isset($_GET['width']) ? $_GET['width'] : '120';
$height = isset($_GET['height']) ? $_GET['height'] : '40';
$characters = isset($_GET['characters']) && $_GET['characters'] > 1 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>


index.php
Код

<html>
<title>Image</title>
<form name="forma" action="regist.php" method="post">
<table border="2">
 <tr>
  <td align="center"><font color=000000><b>Введите символы на изображении:</font></b><br>
   <img src="CaptchaSecurityImages.php?width=150&height=150&characters=6" />
  </td>
 </tr>
 <tr align="center">
  <td><input type="text" size="20" maxlength="6" name="text"></td>
 </tr>
 <tr align="center">
  <td colspan="2"><input style="width:100%;" type="Submit" value="Проверить" name="submit"></td>
 </tr>
</table>
</form>
</html>


regist.php
Код

<?
 session_start();
 
 function check_captcha($captcha) //проверка ввода провероного слова
 {
  if ($_SESSION['security_code'] == $captcha && !empty($_SESSION['security_code']))  {    
    unset($_SESSION['security_code']);
    echo 'Код введен верно!><br /><a href="index.php">Назад</a>';
    return 1;
   }
   else  {    
    $_SESSION["error1"]=1;
    echo 'Код введен <b>НЕ</b> верно!<br /><a href="index.php">Назад</a>';
    return 0;
   }
 }
?>

<?
    check_captcha($_POST['text']);
?> 


Это полностью вся программа ... прикрепить файл с программой не получилось (((

жду предложений ) заранее сасибо!))))

Автор: bars80080 12.12.2008, 01:17
а ты проверял этот шрифт? открой посмотри, в готиках редко встречается русская кодировка. если не критично со шрифтом - возьми более популярный из стандартного набора

Автор: Novich 16.12.2008, 17:35
Также не забываем, что текст в функцию imagettftext нужно передавать в кодировке UTF-8. А у вас нигде нет нужного преобразования. Используйте iconv для перевода в нужную кодировку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)