За последние 24 часа нас посетили 20674 программиста и 1826 роботов. Сейчас ищут 950 программистов ...

Помогите с кодировкой плз

Тема в разделе "PHP и базы данных", создана пользователем AndroNick, 22 янв 2007.

  1. AndroNick

    AndroNick Активный пользователь

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Этот упрощенный скрипт выводит рисунок с текстом, но текст
    выводится всякими иероглифами.. В базе стоит кодировка
    cp1251_general_ci..
    При выводе переменной $row функцией echo в броузер строка
    выводится нормально.


    PHP:
    1. <?php
    2. header("Content-type: image/png");
    3.  
    4. $db_connect = mysql_connect("localhost", "root");
    5. mysql_select_db("db", $db_connect);
    6. $ans=mysql_query("SELECT Text from tips", $db_connect);
    7. $cntrows = mysql_num_rows($ans);
    8. mysql_data_seek ($ans, rand(0, $cntrows-1));
    9. $row = mysql_fetch_row($mysqlanswer);
    10.  
    11. $im = @imagecreate(strlen($row)*5, 50);
    12. $background_color = imagecolorallocate($im, 255, 255, 255);
    13. $text_color = imagecolorallocate($im, 0, 0, 200);
    14. imagestring($im, 0, 0, 0,  $row[0], $text_color);
    15. imagepng($im);
    16. ?>
    Подскажите что не так, пожалуйста.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    подсказываем что не так:
    не так сохраняете изображения - изображения хранят в файлах, а не в базе ибо спасает от гимора.
     
  3. AndroNick

    AndroNick Активный пользователь

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Да пичем здесь хранение изображения?
    Изображение не хранится ни в базе ни в файле
    оно генерится в рhp скрипте и в него вставляется текст из базы...
    Русский текст отображается неверно, кроме знаков (. ,) и т.п.
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    AndroNick
    Сейчас получите предупреждение за разноцветные буквы и злоупотребление жирным шрифтом.
     
  5. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    а тагда соори.
    Причем здесь база тогда?

    Значит текст в windows-1251

    листинг из книги PHP5 Дмитрия Котерова
    PHP:
    1. <?php ## Пример работы с TTF-шрифтом.
    2. require_once "lib/imagettf.php";
    3. // Выводимая строка.
    4. // ВНИМАНИЕ! Для отображения русских букв необходимо их
    5. // передавать не в кодировке Windows, а в Unicode!
    6. $string = toUnicodeEntities("Привет, мир!");
    7. // Шрифт.
    8. $font = getcwd()."/times.ttf";
    9. // Загружаем фоновой рисунок.
    10. $im = imageCreateFromPng("sample02.png");
    11. // Угол поворота зависит от текущего времени.
    12. $angle = (microtime(true)*10)%360;
    13. // Ксли хотите, чтобы текст шел из угла в угол, раскомментируйте строчку:
    14. # $angle = rad2deg(atan2(imageSY($im), imageSX($im)));
    15. // Подгоняем размер текста под размер изображения.
    16. $size = imageTtfGetMaxSize(
    17.   $angle, $font, $string,
    18.   imageSX($im), imageSY($im)
    19. );
    20. // Создаем в палитре новые цвета
    21. $shadow = imageColorAllocate($im, 0, 0, 0);
    22. $color  = imageColorAllocate($im, 128, 255, 0);
    23. // Вычисляем координаты вывода, чтобы текст оказался в центре.
    24. $sz = imageTtfSize($size, $angle, $font, $string);
    25. $x = (imageSX($im) - $sz[0]) / 2 + $sz[2];
    26. $y = (imageSY($im) - $sz[1]) / 2 + $sz[3];
    27. // Рисуем строку текста, вначале черным со сдвигом, а затем -
    28. // основным цветом поверх (чтобы создать эффект тени).
    29. imageTtfText($im, $size, $angle, $x+3, $y+2, $shadow, $font, $string);
    30. imageTtfText($im, $size, $angle, $x, $y, $color, $font, $string);
    31. // Сообщаем о том, что далее следует рисунок PNG.
    32. Header("Content-type: image/png");
    33. // Выводим рисунок
    34. imagePng($im);
    35. ?>
    lib/imagettf.php
    PHP:
    1. <?php ## Библиотека полезных функций для работы с TTF.
    2. // Исправленная функция imageTtfBBox(). Работает корректно
    3. // даже при ненулевом угле поворота $angle (исходная функция
    4. // при этом работает неверно).
    5. function imageTtfBBox_fixed($size, $angle, $fontfile, $text) {
    6.   // Вычисляем размер при НУЛЕВОМ угле поворота.
    7.   $horiz = imageTtfBBox($size, 0, $fontfile, $text);
    8.   // Вычисляим синус и косинус угла поворота.
    9.   $cos = cos(deg2rad($angle));
    10.   $sin = sin(deg2rad($angle));
    11.   $box = array();
    12.   // Выполняем поворот каждой координаты.
    13.   for ($i=0; $i<7; $i+=2) {
    14.     list ($x, $y) = array($horiz[$i], $horiz[$i+1]);
    15.     $box[$i]   = round($x * $cos + $y * $sin);
    16.     $box[$i+1] = round($y * $cos - $x * $sin);
    17.   }
    18.   return $box;
    19. }
    20.  
    21. // Вычисляет размеры прямоугольника с горизонтальными и вертикальными
    22. // сторонами, в который вписан указанный текст. Результирующий массив
    23. // имеет структуру:
    24. // array(
    25. //   0  => ширина прямоугольника,
    26. //   1  => высота прямоугольника,
    27. //   2  => смещение начальной точки по X относительно левого верхнего
    28. //         угла прямоугольника,
    29. //   3  => смещение начальной точки по Y
    30. // )
    31. function imageTtfSize($size, $angle, $fontfile, $text) {
    32.   // Вычисляем охкатывающий многоугольник.
    33.   $box = imageTtfBBox_fixed($size, $angle, $fontfile, $text);
    34.   $x = array($box[0], $box[2], $box[4], $box[6]);
    35.   $y = array($box[1], $box[3], $box[5], $box[7]);
    36.   // Вычисляем ширину, высоту и смещение начальной точки.
    37.   $width  = max($x)-min($x);
    38.   $height = max($y)-min($y);
    39.   return array($width, $height, 0-min($x), 0-min($y));
    40. }
    41.  
    42. // Функция возвращает наибольший размер шрифта, учитывая, что
    43. // текст $text обязательно должен поместиться в прямоугольник
    44. // размерами ($width, $height).
    45. function imageTtfGetMaxSize($angle, $fontfile, $text, $width, $height) {
    46.   $min = 1;
    47.   $max = $height;
    48.   while (true) {
    49.     // Рабочий размер - среднее между максимумом и минимумом.
    50.     $size = round(($max + $min) / 2);
    51.     $sz = imageTtfSize($size, $angle, $fontfile, $text);
    52.     if ($sz[0] > $width || $sz[1] > $height) {
    53.       // Будем уменьшать максимальную ширину до те пор, пока текст не
    54.       // "перехлестнет" многоугольник.
    55.       $max = $size;
    56.     } else {
    57.       // Наоборот, будем увеличивать минимальную, пока текст помещается.
    58.       $min = $size;
    59.     }
    60.     // Минимум и максимум сошлись друг к другу.
    61.     if (abs($max-$min) < 2) break;
    62.   }
    63.   return $min;
    64. }
    65.  
    66. // Функция преобразует текст из кодировки iso8859-5 в Unicode-entities.
    67. // Ее необходимо вызывать перед запуском imageTtfText(), чтобы корректно
    68. // отображать русские буквы. Аргумент $from задает исходную кодировку
    69. // страницы (см. convert_cyr_string() для описания значений параметра).
    70. function toUnicodeEntities($text, $from="w") {
    71.   $text = convert_cyr_string($text, $from, "i");
    72.   $uni = "";
    73.   for ($i=0, $len=strlen($text); $i<$len; $i++) {
    74.     $char = $text{$i};
    75.     $code = ord($char);
    76.     $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;
    77.   }
    78.   return $uni;
    79. }
    80. ?>
     
  6. AndroNick

    AndroNick Активный пользователь

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Спассибо, отображение изменилось!
    Но теперь - ???????? ???? ?????.
    Чем еще поможете?
     
  7. AndroNick

    AndroNick Активный пользователь

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Это ты серъезно?
     
  8. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Серьёзнее некуда...
    На основании:
    Вам предупреждение за разноцветные буквы и злоупотребление жирным шрифтом.

    Два поста подряд оформлены нестандартно, предполагаю, что и дальше вы делали бы тоже самое.
     
  9. AndroNick

    AndroNick Активный пользователь

    С нами с:
    23 сен 2006
    Сообщения:
    17
    Симпатии:
    0
    Ну тогда сори..

    А проблемка то еще осталась...
    Вот новый скрипт на основе подсказки:
    PHP:
    1. <?php
    2. header("Content-type: image/png");
    3.  
    4. $db_connect = mysql_connect("localhost", "root");
    5. mysql_select_db("db", $db_connect);
    6. $ans=mysql_query("SELECT Text from tips", $db_connect);  
    7. $cntrows = mysql_num_rows($ans);
    8. mysql_data_seek ($ans, rand(0, $cntrows-1));
    9. $row = mysql_fetch_row($ans);
    10.  
    11. $row = toUnicodeEntities($row);
    12. $font = "arial.ttf";
    13.  
    14. $im = @imagecreate(100, 50);
    15. $background_color = imagecolorallocate($im, 255, 255, 255);
    16. $text_color = imagecolorallocate($im, 0, 0, 200);
    17. imagettftext($im, 20, 0, 10, 20, $text_color, $font, $row);
    18. imagepng($im);
    19.  
    20. function toUnicodeEntities($text, $from="w") {  
    21.   $text = convert_cyr_string($text, $from, "i");
    22.   $uni = "";  
    23.   for ($i=0, $len=strlen($text); $i<$len; $i++) {  
    24.     $char = $text{$i};  
    25.     $code = ord($char);  
    26.     $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;  
    27.   }  
    28.   return $uni;  
    29. }
    30. ?>
    Отображаются знаки - ?????? ???? ????.

    Но если текст добавлять не из базы, а непосредственно
    из скрипта, то отображение нормальное:
    PHP:
    1. <?php
    2. $row = "Мой текст.";
    3. $row = toUnicodeEntities($row);
    4. $font = "arial.ttf";
    5.  
    6. $im = @imagecreate(100, 50);
    7. $background_color = imagecolorallocate($im, 255, 255, 255);
    8. $text_color = imagecolorallocate($im, 0, 0, 200);
    9. imagettftext($im, 20, 0, 10, 20, $text_color, $font, $row);
    10. imagepng($im);
    11.  
    12. function toUnicodeEntities($text, $from="w") {  
    13.   $text = convert_cyr_string($text, $from, "i");
    14.   $uni = "";  
    15.   for ($i=0, $len=strlen($text); $i<$len; $i++) {  
    16.     $char = $text{$i};  
    17.     $code = ord($char);  
    18.     $uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;  
    19.   }  
    20.   return $uni;  
    21. }
    22. ?>
     
  10. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    значит из базы приходит не windows-1251
     
  11. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Во! Тоже столкнулся с этой проблемой, что русские символы выглядят кракозябрами, если пытаться их нарисовать. Плохо понимаю о кодировках (надо будет как-нибудь на досуге разобраться), но интересно, а почему просто функция

    $text = utf8_encode($text);

    не помогает исправить ситуацию?

    А за функцию toUnicodeEntities($text, $from="w") спасибо, конечно! :) В моих учебниках по PHP, к сожалению, не рассматриваются вопросы генерации русских текстов на картинках, только английские...