Aller au contenu

Parser une chaine UTF8 en php


Sujets conseillés

Posté (modifié)

Bonjour,

je ne parvient pas à "parser" une chaine en utf8.

Chaque caractère à une largeur en pixel définie dans une table, et mon système passe une ligne tous les 94px. Mais cela marche mal avec certains caractères.. J'ai mis mon code en dessous, pourriez vous m'aider ?

et voici le résultat de mon code : http://chouquette.fr/postForum6895364/generer.php

certains caractères deviennent des "�"

Merci d'avance !

Pierre.

ps: j'ai besoin des caractères spéciaux (quelques lettre grecs et symboles mathématiques) donc je ne souhaite pas les supprimer.


<?php
header( 'content-type: text/html; charset=utf-8' );

$table = array();
// tous les caracteres font 4 pixel éxéptés ceux-ci :
$table['à'] = 5;
$table['f'] = 3;
$table['i'] = 2;
$table['l'] = 3;
$table['m'] = 6;
$table['s'] = 3;
$table['t'] = 3;
$table['û'] = 5;
$table['w'] = 6;
$table['z'] = 5;

$table['µ'] = 5;
$table['°'] = 5;
$table['!'] = 2;
$table['#'] = 6;
$table['$'] = 6;
$table['&'] = 5;
$table['('] = 3;
$table[')'] = 3;
$table[','] = 3;
$table['.'] = 2;
$table['\''] = 2;
$table['-'] = 4;
$table[';'] = 3;
$table['@'] = 6;
$table['['] = 3;
$table[']'] = 3;
$table['|'] = 2;
$table[' '] = 1;
$table['*'] = 6;

$table['≠'] = 6;
$table['≤'] = 5;
$table['≥'] = 5;
$table['→'] = 5;

$table['α'] = 5;
$table['γ'] = 5;
$table['μ'] = 5;
$table['π'] = 6;
$table['ρ'] = 5;
$table['σ'] = 5;
$table['τ'] = 5;
$table['Φ'] = 6;

$table['Δ'] = 6;
$table['Σ'] = 5;
// exemple de texte qui ne marche pas car de nombreux caracteres
// sont codés sur plusieurs bits en UTF8
$textedebut = "Iñtërnâtiônàlizætiøn αβγδεθλμπρστΦχ→≡≤≥≠³²√";
$textedebut = str_replace("\r\n","\n",$textedebut);
$tailleLigne = 0;
$texte = "";
$tCaract = 0;

for($z=0; $z<mb_strlen($textedebut); $z++) {

if($textedebut[$z] == "\n") {
$tailleLigne = 0;
}
else {
$tCaract = 4;
if(array_key_exists($textedebut[$z], $table)){
$tCaract = $table[$textedebut[$z]];
}
$tailleLigne += $tCaract;
if ($tailleLigne > 93) {
$texte.= "\n";
$tailleLigne = $tCaract;
}
}
$texte .= $textedebut[$z];

}
echo $texte;
?>

Modifié par Olphebus
Posté

Ca me semble un peu bizarre ce que tu fais, mais bon...

Le problème vient à mon avis du fait que tu utilises $textedebut[$z] pour prendre un caractère, ce qui semble être troublé par l'UTF-8 (parce que ça prend les octets qui composent le caractère un par un, et donc de temps en temps tu insères un \n au milieu d'un caractère... et accessoirement il ne trouvera jamais les caractères en question dans ta table).

Utilise plutôt mb_substr($textedebut,$z,1), ça devrait mieux marcher.

Jacques.

Posté (modifié)

merci pour ton aide ! ca marche nickel !

au fait je l'utilise pour générer un code assembleur pour afficher du texte sur un écran lcd..

mon écran LCD ne peut afficher que 94pixel sinon ca bug, donc je formate le texte en php avant.

donc c'est pas bizarre ^^

Modifié par Olphebus
Posté

Et les caractères font 4 pixels de large en tout, y compris l'espacement entre les caractères? Et il supporte tous les caractères UTF-8?

Jacques.

Posté (modifié)

Nan il ne supporte pas tous les caractères UTF8,mais il fait pas mal de caractères grecs et de caractères mathématiques ( intégral, racine carré, etc..) que seul l'utf8 possède sur le pc je crois..

tous les caractères sauf ceux de la table font 4px et l'espacement entre les caractères est compris dans les chiffres.

et c'est mon compilateur asm qui fait la correspondance du code utf8 au code de mon lcd.

Merci !

Pierre.

Modifié par Olphebus
Posté

4 pixels espace inclus (donc 3 pixels pour le caractère lui-même) c'est super hard. Rien que pour distinguer N, M et H par exemple c'est quasiment impossible. Et même 4 pixels hors espace (ce qui rendrait ton décompte faux) c'est vraiment difficile. Un bon vieux Minitel en mode 80 colonnes c'était 6 pixels de large par caractère, espacement inclus. Tu es vraiment sûr de tes décomptes?

Jacques.

Posté (modifié)

Oui c'est bien 3 pixel pour le caractère lui même, voici quelques caractères de la police, je les aient pas tous mis mais ils font tous 4 pixel hormis les exceptions de la table :
/>http://chouquette.fr/postForum6895364/exemple/

1 pixel sur l'ecran lcd est plus gros que 1 pixel sur le PC donc on les distingue assez clairement malgré tout.

exemple de texte :
/>http://chouquette.fr/postForum6895364/exemple/SCREEN01.BMP

(la taille à été doublé par deux car sinon ca parait petit sur un écran de pc mais il y a bien 3 "pixels" pour chaque caractère)

(si ca t'intéresse et que tu veux que je mette les images de toute la police je peux le faire)

Sinon le LCD propose une deuxième police de caractère plus grosse ou tous les caractères font 6 de large sans exception mais je vais me servir de la petite elle permet de mettre nettement plus de texte.

Modifié par Olphebus
Posté

pour moi le n ressemble à un caractère tronqué, car il représente le caractère minuscule alors que les autres sont en majuscule

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...