IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Analyser une chaine UTF-8


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 17
    Points : 12
    Points
    12
    Par défaut Analyser une chaine UTF-8
    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 les caractères utf8 codés sur plusieurs bits, ceux ci ne s'affichent pas correctements.. J'ai mis mon code en dessous, pourriez vous m'aider ?

    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.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    <?php
    $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<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;
    ?>

    edit: il semble que certains caractères s'affichent mal sur le forum (tous les &# ... ), désolés.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    en UTF8, il faut utiliser mb_strlen
    http://www.php.net/manual/fr/function.mb-strlen.php

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    merci pour ta réponses rapide !
    ca m'aide mais j'ai encore des problemes
    j'ai aussi rajouté dans mon code : header( 'content-type: text/html; charset=utf-8' ); et ca marche mieux..
    mais quelques caracteres bug, c'est assez étrange voici le resultat :
    http://chouquette.fr/postForum6895364/generer.php

    et voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    <?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;
    ?>

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il faut egalement decouper en multibyte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    $longueur = mb_strlen($textedebut);
    for($z=0; $z < $longueur; $z++) {
     
    $caractere = mb_substr($textedebut, $z, 1,'UTF-8');
     
    if($caractere == "\n") {
    $tailleLigne = 0;
    }
    else {
     
    	$tailleLigne += isset($table[$caractere]) ? $table[$caractere] : 4; 
    	if ($tailleLigne > 93) {
    		$texte.= "\n";
    		$tailleLigne = $tCaract;
    	}
    }
    $texte .= $caractere;
     
    }
    echo '<br/>';
    echo $texte;
    ?>
    Par contre tes caractères "&#" se retrouvent coupés en plein milieu puisqu'ils sont lu caractere par caractere.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 17
    Points : 12
    Points
    12
    Par défaut
    merci beaucoup ca marche nickel ! ! !
    sinon je n'ai pas de caractere &# c'est sur le forum quand je poste que ca modifie mes caractères et que ca ajoute des &#.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Analyser une chaine de caractère et la formater
    Par saad.hessane dans le forum C
    Réponses: 10
    Dernier message: 19/07/2008, 17h07
  2. [RegEx] Analyser une chaine
    Par anibal dans le forum Langage
    Réponses: 4
    Dernier message: 28/09/2007, 12h29
  3. [.NET 2.0] Convertir une chaine utf-8 en Ascii
    Par abelman dans le forum Framework .NET
    Réponses: 2
    Dernier message: 30/04/2007, 20h47
  4. Analyser une chaine de caractère
    Par dahu17 dans le forum C#
    Réponses: 6
    Dernier message: 23/04/2007, 14h39
  5. analyser une chaine de caractere
    Par phpaide dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/05/2006, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo