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 :

php template rtf en arabe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut php template rtf en arabe
    J’utilise le code suivant pour ecrire dans un fichier rtf (contenant du français et de l’arabe) des variables php (wampserver php version 5.03.10) contenant des chaines de caractères en arabe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
        $myContent = file_get_contents("modele.rtf" );
        //$myContent = str_replace("@nom@",html_entity_decode($nom),$myContent);
        //$nom = utf8_encode($nom);
        //$nom = base64_encode($nom);
        $nom = htmlspecialchars($nom) ;
        //$myContent = str_replace("@nom@",$nom,$myContent);
        $myContent =mb_ereg_replace("@nom@",$nom,$myContent);
        $newFileHandler = fopen("../impression/".$nf.".rtf","a" );
        fwrite($newFileHandler,$myContent);
        fclose($newFileHandler);

    Lors de l’ouverture du fichier les caractères arabe ne s’affiche pas (بسام ) ou (ميعاوي) ou ( ????????)
    En éditant manuellement le fichier résultat $nf.RTF j’ai remarqué que la chaine بسام s’écrit \'c8\'d3\'c7\'e3 (c'est quoi d’ailleurs comme codage ?)

    je récupère la chaine بسام d'un formulaire ($_POST). encodé en utf-8 (j'ai vérifié avec mb_detect_encoding) ... ..l'enregistrement au niveau de la base de données ne pose pas de problème, mon problème vient du fichier RTF ma fonction écrit ceci sur le fichier:
    {\rtlch\fcs1 \ab\af42\alang7169 \ltrch\fcs0 \b\f42\fs24\insrsid11479835\charrsid13048379 بسام} => affichage ميعاوي
    alors que, il faut aboutir à ce résultat :
    {\rtlch\fcs1 \ab\af42\alang7169 \ltrch\fcs0 \b\f42\fs24\insrsid11479835\charrsid13048379 \'C8\'D3\'C7\'E3}
    J'ai trouvé la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        function ascii2hex($ascii) {
            $hex = '';
            for ($i = 0; $i < strlen($ascii); $i++) {
            $byte = strtoupper(dechex(ord($ascii{$i})));
            $byte = str_repeat('0', 2 - strlen($byte)).$byte;
            $hex.=$byte." ";
            }
            return $hex;
            }
    mais au lieu de c8d3c7e3 j'obtiens d8a8d8b3d8a7d985 !!
    comment passer de بسام à \'C8\'D3\'C7\'E3 ???
    y'a t'il un moyen plus simple de fixer l'encodage à UTF-8 directement au niveau du fichier RTF(ou doc) ?
    merci de m'aider.

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Il s'agit de l'encodage WINDOWS-1256, tu peux tester en plaçant ta chaîne dans $str:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // UTF-8
    echo unpack('H*', $str)[1] . "\n\n";
     
    // WINDOWS-1256
    $str = iconv('UTF-8', 'WINDOWS-1256', $str);
    echo unpack('H*', $str)[1] ;
    Tu peux donc faire la transformation en ajoutant \' tous les deux caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $str = iconv('UTF-8', 'WINDOWS-1256', $str);
    echo preg_replace('~..~', "\\'$0", unpack('H*', $str)[1]);
    D'ailleurs le problème n'est pas propre aux lettres arabes mais aux caractères non-ascii en général. On peut par exemple transformer tout un texte en ne sélectionnant que les caractères non-ascii:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $result = preg_replace_callback('~[^[:ascii:]]~u', function ($m) {
        return "\\'" . unpack('H*', iconv('UTF-8', 'WINDOWS-1256', $m[0]))[1];
    }, $text);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre régulier
    Inscrit en
    Mai 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 117
    Points : 85
    Points
    85
    Par défaut
    Merci beaucoup. ça m'a énormément aidé. Par contre preg_replace_callback ne fonctionne pas j'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $res= unpack('H*', $res);
    $res = $res[1];
    for ($i=0;$i<=strlen($res)-2;$i+=2)
    $resu .= "\\'". strtoupper($res[$i]). strtoupper($res[$i+1]);
    je marque comme résolu. Merci beaucoup.

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

Discussions similaires

  1. Création templates RTF par les utilisateurs
    Par dubitoph dans le forum Langage
    Réponses: 7
    Dernier message: 05/03/2009, 17h25
  2. PHP et la langue arabe !
    Par omarfla dans le forum Langage
    Réponses: 8
    Dernier message: 09/05/2007, 18h29
  3. [Templates] Php, templating possible?
    Par lolo le belge dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 05/03/2006, 10h38

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