ya encontré la santa solución y pondré la respuesta aquí por que se que mas de uno tendrá el mismo problema.
las 2 funciones para escribir caracteres con fuentes (imagettftext e imagefttext) no permiten caracteres que superen los 127 bytes (como tildes y eñes) y imprimen normalmente las codificaciones en otras palabras esta hecho para ingleses.
Por suerte en el manual de PHP alguien publicó una solución creada por el mismo (limalopex.eisfux.de), la función es la siguiente:
Código PHP:
Ver original
function foxy_utf8_to_nce( $utf = EMPTY_STRING ) {
if($utf == EMPTY_STRING) return($utf);
$max_count = 5; // flag-bits in $max_mark ( 1111 1000 == 5 times 1)
$max_mark = 248; // marker for a (theoretical ;-)) 5-byte-char and mask for a 4-byte-char;
$html = EMPTY_STRING;
for($str_pos = 0; $str_pos < strlen($utf); $str_pos++) { $old_chr = $utf{$str_pos};
$old_val = ord( $utf{$str_pos} ); $new_val = 0;
$utf8_marker = 0;
// skip non-utf-8-chars
if( $old_val > 127 ) {
$mark = $max_mark;
for($byte_ctr = $max_count; $byte_ctr > 2; $byte_ctr--) {
// actual byte is utf-8-marker?
if( ( $old_val & $mark ) == ( ($mark << 1) & 255 ) ) {
$utf8_marker = $byte_ctr - 1;
break;
}
$mark = ($mark << 1) & 255;
}
}
// marker found: collect following bytes
if($utf8_marker > 1 and
isset( $utf{$str_pos + 1} ) ) { $str_off = 0;
$new_val = $old_val & (127 >> $utf8_marker);
for($byte_ctr = $utf8_marker; $byte_ctr > 1; $byte_ctr--) {
// check if following chars are UTF8 additional data blocks
// UTF8 and ord() > 127
if( (ord($utf{$str_pos + 1}) & 192) == 128 ) { $new_val = $new_val << 6;
$str_off++;
// no need for Addition, bitwise OR is sufficient
// 63: more UTF8-bytes; 0011 1111
$new_val = $new_val | ( ord( $utf{$str_pos + $str_off} ) & 63 ); }
// no UTF8, but ord() > 127
// nevertheless convert first char to NCE
else {
$new_val = $old_val;
}
}
// build NCE-Code
$html .= '&#'.$new_val.';';
// Skip additional UTF-8-Bytes
$str_pos = $str_pos + $str_off;
}
else {
$new_val = $old_val;
}
}
return($html);
}
Para llamar a la función previamente se debe decodificar las entidades HTML, así que recomiendo llamarla así:
y listo, la funcion convierte a unicode numerico de HTML el caracter desde ascii para ambos de mas de 127 bytes (UTF-8 + ANSI)