UTF, imageTTFText() - нарисовать строку посимвольно

Mich

Продвинутый новичёк
UTF, imageTTFText() - нарисовать строку посимвольно

Необходимо нарисовать UTF8-строку посимвольно (т.е. следующий код идет UTF8 !!):

PHP:
<?php
function str_isUtf8($str) {
	return $str ? preg_match('/^.{1}/us', $str) : true;
}

function str_len($str) {
	if (str_isUtf8($str)) {
		return strLen(utf8_decode($str));
	} else {
		return strLen($str);
	}
}

$str = 'абвгд';

$img = imageCreateTrueColor(300, 100);
for ($len = str_len($str), $i = 0; $i < $len; $i++) {
	imageTTFText($img, 20, 0, 20, 20, imageColorAllocate($img, 255, 255, 255), 'arial.ttf', $str[$i]);
}
header('Content-type: image/png');
imagePng($img);
imageDestroy($img);
?>
Но... запустите пример :) Что неправильно?
 

Wicked

Новичок
а причем тут utf-8, если ты выводишь строку в SB кодировке?
 

Mich

Продвинутый новичёк
Не знаток кодировок. Объясни плиз подробнее.
 

Mich

Продвинутый новичёк
Ну давай пофлеймим :)
На мой взгляд все правильно. Твоё мнение?
 

phprus

Moderator
Команда форума
$str[$i] - вот это и не правильно для твоего случая. Почему думай сам. Подсказка: символ в кодировке utf-8 может занимать несколько байтов.
 

Wicked

Новичок
1) ты в курсе, что UTF-8 - многобайтовая кодировка, т.е. в ней под один символ отводится 1 или более байт? С другой стороны, ты используешь побайтовый доступ - $str[$i]. Таким образом у тебя на экран выводится сначала первый байт первого символа, потом второй байт первого символа, потом первый байт второго символа и т.д. В результате чего выводится абсолютно другой текст.

2) Все символы визуально выводятся в одну и ту же позицию.

3) $str = 'абвгд'; - это, скорее всего, не utf-8, а что-то типа win1251.
 

Mich

Продвинутый новичёк
1) это ты за меня описал проблему :) спасибо. решить это можно как-то?
2) не увидел, когда выделял для примера.
3) я написал, что код utf.
 

phprus

Moderator
Команда форума
Wicked
3) $str = 'абвгд'; - это, скорее всего, не utf-8, а что-то типа win1251.
Если исходник скрипта в utf-8 и редактор поддерживает кодировку utf-8 то в нем этот текст будет виден именно так как написано.

К тому же автор указал, что исходник в кодировке utf-8.

-~{}~ 15.06.06 22:47:

Mich
Используй для выделения очередного символа функцию iconv_substr, и кроме этого вместо своей функции str_len лучше использовать встроенную iconv_strlen. Если у тебя php4 то используй функции mb_substr и mb_strlen соответственно.
 

Mich

Продвинутый новичёк
Спасибо, mb_ правда нет, но я нашел замену. Можно удалять :)
 
Сверху