Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.10.2016, 16:11   #1
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
Вопрос конвертация из windows-1251 в unicode

Всем привет, была поставлена задача генерировать картинки с надписями на русском языке, все методы которые я нашел в интернете не работают, тут наткнулся на сообщения, что если вставлять тест в unicode все решиться и реально все заработало так :

PHP код:
 public function hAction()
    {
        
header("Content-type: image/png");
        
$string "Простая Текстовая Строка";
        
$im imagecreate(300,300);
        
imagecolorallocate($im255255255);
        
$fontName =  'CaviarDreamsBold.ttf';
        
$fontSise 18;
        
$x 10;
        
$y 30;
        
$textColor imagecolorallocate($im000);
        
imagettftext$im$fontSise0$x$y,  $textColor$fontName'&_#_1040;&_#_1046;');
        
imagepng($im'/var/data/temp/pdf-generation/maps/button7.png');
        
imagedestroy($im);

    } 
т.е с текстом в формате unicod-а - '&_#_1040;&_#_1046;'. ( дописал нижние подчеркивания что бы сайт не конвертировал их в буквы)

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

PHP код:
function convert($str)
{
 
$string //тут декодируем строку все равно чем и во что
//utf8_decode 
//mb_convert_encoding
//convert_cyr_string
//iconv

for ($result=''$i=0$i<strlen($str); $i++) {
          
$charcode ord($str[$i]);   // переводит в  ASCII-код
          
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
        }

только не могу понять из чего в чего переводить, у одного автора была
convert_cyr_string($s,'w','i'); // преобразование win1251 -> iso8859-5
а потом
PHP код:
for ($result=''$i=0$i<strlen($str); $i++) {
          
$charcode ord($str[$i]);   // переводит в  ASCII-код
          
$result .= ($charcode>175)?"&#".(1040+($charcode-176)).";":$s[$i];
        } 
но не прокатило.... Пробовал все что можно, может кто нибудь подскажет как легче это сделать и все же в чего перевести windows-1251 что бы в дальнейшем можно было конвертироваться в unicode - типа http://prntscr.com/cz68o9
Тёма_) вне форума Ответить с цитированием
Старый 26.10.2016, 16:27   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

1. А сам файл php в кодировке utf8?
2. Для конвертации меж кодировками копайте iconv
ADSoft вне форума Ответить с цитированием
Старый 26.10.2016, 16:30   #3
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

Да, там еще присутствует
Код:
header("Content-type: text/html; charset=utf-8");
Тёма_) вне форума Ответить с цитированием
Старый 26.10.2016, 16:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Да, там еще присутствует header("Content-type: text/html; charset=utf-8");
тем более! я бы Вам рекомендовал сконвертировать ВСЁ содержимое PHP скриптов в UTF-8, тогда бы у Вас такой проблемы не было.
(у Вас они не в той кодировке, вот и получаете такую проблему!)

но, если Вам по какой-то причине нужно, чтобы содержимое скриптов было в кодировке 1251,
попробуйте такой код:

Код:
// Текст надписи
$text = 'Проверка Тест...';
$text_utf8 = mb_convert_encoding($text, "utf-8", "windows-1251");
.....
imagettftext( $im, $fontSise, 0, $x, $y,  $textColor, $fontName, $text_utf8);

p.s. по отдельным переменным в коде я разложил для наглядности


p.p.s. кодировку скрипта можно посмотреть в редакторе.
на крайний случай, если под рукой ничего нет, тогда откройте обычный notepad (под Windows 7 или старше)
откройте свой PHP файл в нём. нажмите сохранить КАК и посмотрите, что у Вас стоит в поле "Кодировка" - если там стоит ANSI - то это и есть windows1251

Последний раз редактировалось Serge_Bliznykov; 26.10.2016 в 16:42.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.10.2016, 16:43   #5
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

Да я так пробовал, у меня картинка получается тогда такая http://prntscr.com/cz6qeq

при вот таком коде

Код:
public function hAction()
    {
        header("Content-type: image/png");
        header("Content-type: text/html; charset=utf-8");
        $string = "Простая Текстовая Строка";
        $im = imagecreate(300,300);
        imagecolorallocate($im, 255, 255, 255);

        $fontName =  'CaviarDreamsBold.ttf';

        $fontSise = 18;
        $x = 10;
        $y = 30;

        $text = 'Проверка Тест...';
        $text_utf8 = mb_convert_encoding($text, "utf-8", "windows-1251");
        $textColor = imagecolorallocate($im, 0, 0, 0);
 
        imagettftext( $im, $fontSise, 0, $x, $y,  $textColor, $fontName, $text_utf8 ); 
        imagepng($im, '/temp/pdf-generation/maps/7.png');
        imagedestroy($im);

    }
Тёма_) вне форума Ответить с цитированием
Старый 26.10.2016, 16:54   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну нет нормальных русских букв в вашем 'CaviarDreamsBold.ttf'
возьмите другой, нормальный шрифт.
да хоть тот же
Код:
$font = 'arial.ttf';
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.10.2016, 17:18   #7
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

только что попробовал на 7 разных шрифтах, два из них были 'arial.ttf', но скачивал их из инета, все отображаются как квадратики либо вообще не отображается текст...
Тёма_) вне форума Ответить с цитированием
Старый 26.10.2016, 17:53   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

попробуйте положить ttf файл рядом со скриптом
и в скрипте сделать так:
Код:
$font = './arial.ttf';
вот, попробуйте архив распаковать куда-нибудь на сервер и открыть test_image.php

test_image.rar
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.10.2016, 18:08   #9
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

я просто еще не понимаю, почему при конвертации. допустим вот этого:
Код:
$str = convert_cyr_string('Всем привет','w','i');
и при переводе в ASCII
Код:
$len = strlen($str);
        for($i = 0; $i < $len ;$i++)
        {
            $code = ord($str[$i]);
            var_dump('$char = ' . $code);
        }
он мне выдает

string(11) "$char = 192"
string(10) "$char = 46"
string(11) "$char = 193"
string(10) "$char = 46"
string(11) "$char = 192"
string(10) "$char = 46"
string(11) "$char = 192"
string(10) "$char = 46"
string(10) "$char = 32"
string(11) "$char = 192"
string(10) "$char = 32"
string(11) "$char = 193"
string(10) "$char = 46"
string(11) "$char = 192"
string(11) "$char = 241"
string(11) "$char = 192"
string(10) "$char = 32"
string(11) "$char = 192"
string(10) "$char = 46"
string(11) "$char = 193"
string(10) "$char = 46"
Тёма_) вне форума Ответить с цитированием
Старый 26.10.2016, 18:21   #10
Тёма_)
Пользователь
 
Регистрация: 12.11.2011
Сообщений: 68
По умолчанию

Сделал как Вы сказали, положил Ваш arial.ttf в ту папку где и скрипт Ваш, получилась белая полоска без текста вот - http://prntscr.com/cz8649
Тёма_) вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
utf-8 -> windows-1251 Lihosvet Visual C++ 10 03.09.2022 16:37
Кодировка Windows -1251 в cURL? AlienNation PHP 2 19.11.2012 11:57
UTF-8 to WINDOWS-1251 Zanooda Общие вопросы Delphi 9 20.07.2011 08:13
URLEncode (windows-1251) kirsan007 Общие вопросы Delphi 2 04.05.2011 20:14
php перекодировка из utf-8 в windows-1251 world12_tk PHP 3 25.04.2010 22:55