imagettftext(): any2eucjp(): something happen - WTF?

Pin

Новичок
imagettftext(): any2eucjp(): something happen - WTF?

Здравствуйте.

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

Такая ошибка выходит:
imagettftext(): any2eucjp(): something happen in /*/*/*/* on line xxx

В коде (на другом хосте все ок):
$char[$i] = win2utf($char[$i]);
imagettftext ($im, 9, 37, $x, $y, $blc, "fnt/verdana.ttf", $char[$i]);

поиск по any2eucjp ничего не дал... И вообще что это за выражение: something happen in... ???
 

tony2001

TeaM PHPClub
http://php4you.kiev.ua/docs/image.php.html - судя по всему, это работает.
хотя, я себе слабо представляю зачем сначала переводить в ISO, а потом в UTF, если можно и сразу в UTF.

>поиск по any2eucjp ничего не дал... И вообще что это за выражение: something happen in... ???
см. php-src/ext/gd/libgd/gdkanji.c, если действительно интересно.
могу предположить, что у тебя либо битый результат перекодирования, либо проблемы с GD.
 

Pin

Новичок
Спасибо, чувак!
Все работает по тому примеру. Но я ничего не понимаю!
Есть 2 функции - обе пепеврдят в юникод. Но win2utf не работает, а win2uni - работает. ПОЧЕМУ?

function win2utf($str)
{
$utf = "";
for($i = 0; $i < strlen($str); $i++)
{
$donotrecode = false;
$c = ord(substr($str, $i, 1));
if ($c == 0xA8) $res = 0xD081;
elseif ($c == 0xB8) $res = 0xD191;
elseif ($c < 0xC0) $donotrecode = true;
elseif ($c < 0xF0) $res = $c + 0xCFD0;
else $res = $c + 0xD090;
$utf .= ($donotrecode) ? chr($c) : (chr($res >> 8) . chr($res & 0xff));
}
return $utf;
}


function win2uni ($winstr){
$isoline = convert_cyr_string($winstr, "w", "i");

for ($i=0; $i < strlen($isoline); $i++){
$thischar=substr($isoline,$i,1);
$charcode=ord($thischar);
$uniline.=($charcode>175) ? "&#" . (1040+($charcode-176)). ";" : $thischar;
}
return $uniline;
}

-~{}~ 28.11.04 14:41:

Забыл сказать - на 1 хостинге есессно выводились квадратики без перевода в юникод. Стал использовать 1 функцию, перешел на 2ой хостинг - там опять все не по-человечески. И вторая функция в итоге стала работать на 2 хосте.
 

SiMM

Новичок
Pin, т.е. разницу в этих двух функциях ты абсолютно не видишь?
PS: а вообще - обе функции работают именно так, как описан их алгоритм, и ничуточки от него не отклоняются.
 

Pin

Новичок
по документации обе переводят в юникод. Везде используется ord(...) + доведение до кондиции (по-разному, заметил).
А фишка в том, что 1 функция работает на gf 2.0.15, а вторая на 2.0.23
 

SiMM

Новичок
А фишка в том, что ты нифига не понял и не можешь отличить UTF-8 от Unicode в HTML.
PHP:
$str = "Pin нифига не понял";
echo 'win2utf: '.win2utf($str)."<br>\n";
echo 'win2uni: '.win2uni($str);
Теперь запускаешь это дело и смотришь Вид->Просмотр HTML-кода (или, что выглядит более разумным, смотришь на результат в hex-редакторе). Уверяю, что на обоих хосингах обе функции ведут себя абсолютно одинаково.
 

Pin

Новичок
Вобщем-то был топик по переведиению строки в юникод - оттуда я и взял функцию. И было сказано - русские буквы рисуются в гд корректно через юникод. Но то был на самом деле utf-8. Теперь я это вижу...
 

berkut

Новичок
Камрады, подскажите пожалуйста, в gd нужно всё-таки писать юникодом, а не утф-8? Если-да, то как он обозначается по научному? charset=
У меня вылазиет
Warning: imagettftext(): any2eucjp(): invalid code in input string in
Причём на своей машине и на своём хосте я перекодировал в utf-8 с помощью iconv. Пробывал вышеприведённые ф-ии
function win2utf($str)
function win2uni ($winstr)
+ фу-ию
PHP:
function strcod ($isoline){
//$uniline=convert_cyr_string($isoline, "w", "i");  
   for ($i=0; $i < strlen($isoline); $i++){ 
       $thischar=substr($isoline,$i,1); 
       $charcode=ord($thischar); 
       $uniline.=($charcode>191) ? "&#" . (1040+($charcode-192)). ";" : $thischar;   
   }
   return $uniline; 
}
с
http://iunu.net/index.php?act=Print&client=printer&f=16&t=1292
и во всех случаях выводится нормальный текст!
Но поставил на другой сервер, и во всех случаях(кроме iconv-не установлена) ошибки с imagettftext(): any2eucjp(): с разным описанием.
Почему на 2 машинах работает, а на 3-й нет? И как заставить работать на всех?
 

Pin

Новичок
У меня та же история - на одном сервере и впрямь работал юникод, на втором utf-8. Я остановился на втором....
 
Сверху