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 :

Caractères hexadécimaux différents mais affichage identique


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Janvier 2003
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 133
    Points : 101
    Points
    101
    Par défaut Caractères hexadécimaux différents mais affichage identique
    bonjour à tous,

    voila je suis en train de realiser un paquage gerant les données audio.
    Dans ce package, je souhaite proposer plusieurs moyens de lire les tags ID3 des mp3 et notamment un lecteur binaire qui les recupère depuis les entetes du fichiers. Celui ci fonctionne presque à l'exception des entêtes définies par l'utilisateur (frames mentionnées TXXX). En effet, au lieu d'avoir comme pour les entetes ID3 classiques IDframe => valeur on a TXXX=>valeur, avec valeur l'identifiant de la frame définie par l'utilisateur une chaine contenant l'identifiant de la frame et sa valeur.
    Il faut donc que je parse le contenu de ses valeurs binaires.
    J'arrive bien a récupérer le contenu de la frame, mais je n'arrive pas a parser le contenu car il semblerait que certains caractères soient interprétés par PHP malgré une valeur hexadecimale différente.
    Un exemple sera surement plus parlant:
    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
     
        /**
         * look in user defined frames for a string
         * @param string $frameName the related frame name
         * @return Audio_Tags_Value
         */
        private function _lookInUserDefinedFrames ($frameName)
        {
           // ID3 tags content is set in UTF16, so setting the frameName to look for in value in UTF16
            $frameName = mb_convert_encoding($frameName, "UTF16");
            // if key has not yet been found...
            if (!array_key_exists($frameName, $this->_frameCache)) {
                $value = null;
                // look inside the user defined frames for $frameName by parsing values
                foreach ($this->_tags->getUsersDefinedFrames() as $currentValue) {
                   // $currentValue = trim($currentValue);
                    echo "-----------------------------------".PHP_EOL;
                    echo "frame: ". bin2hex($frameName).PHP_EOL;
                    echo "value: ". bin2hex($currentValue).PHP_EOL;
                    echo "testing '$currentValue' for $frameName".PHP_EOL;
                    if (mb_strpos(bin2hex($currentValue), bin2hex($frameName))!==false) {
                        echo "found!!!!!!!!!!!!".PHP_EOL;
                        $value = trim(mb_substr($currentValue, strlen($frameName)));
                        break;
                    } ELSE {
                        echo "not found".PHP_EOL;
                    }
                }
                // save it in cache
                $this->_frameCache[$frameName] =  new Audio_Tags_Value($value);
            }
            return (array_key_exists($frameName, $this->_frameCache) ? $this->_frameCache[$frameName] : null);
        }
    ce qui me donne en sortie pour l'analyse d'un mp3 en recherchant la valeur d'une frame definie par l'utilisateur s'appelant "MusicBrainz Album Id":
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    -----------------------------------
    frame: 004d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064
    value: fe4d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064000000fffe360035006600340066003000630035002d0065006600390065002d0034003900300063002d0061006500650033002d003900300039006500370061006500360062003200610062
    testing '�MusicBrainz Artist Id��65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab' for MusicBrainz Artist Id
    not found
    ...
    si on regarde la comparaison du contenu de la frame encodée en UTF16 avec la valeur, on voit que toute la valeur est identique, à l'exception du premier caractère:
    dans la frameValue recherchée, j'ai 004d qui correspond bien à un "M" alors que dans la valeur j'ai fe4d qui correspond selon http://www.fileformat.info a un "_". Or PHP m'affiche bien un M (précédé d'un caractère bizarre).
    J'ai bien essayé de reduire la taille des données obtenues lors du parsing des frames pour supprimer ce caractère bizarre en debut de chaine. dans ce cas, cela me donne:
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    -----------------------------------
    frame: 004d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064
    value: 4d00750073006900630042007200610069006e007a0020004100720074006900730074002000490064000000fffe360035006600340066003000630035002d0065006600390065002d0034003900300063002d0061006500650033002d00390030003900650037006100650036006200320061006200
    testing 'MusicBrainz Artist Id��65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab' for MusicBrainz Artist Id
    not found
    4d00 ne represente pas un caractère unicode valide. du coup, php complète t'il la structure de la chaine pour l'affichage? et du coup, auriez vous une idée sur la facon dont je pourrais tester réellement l'existence de la frame et récupérer sa valeur?
    Tout aide me sera utile.
    Cordialement,

  2. #2
    Membre chevronné Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Points : 1 895
    Points
    1 895
    Par défaut
    à l'appel de la fonction "mb_strpos", ajoute le 3e paramètre pour indiquer avec quel encodage tu travailles

Discussions similaires

  1. [HTML 4.0] 2 fichiers html avec codes identiques mais affichages différents !?
    Par lololebricoleur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 26
    Dernier message: 23/11/2013, 15h19
  2. Réponses: 8
    Dernier message: 21/03/2012, 10h51
  3. Réponses: 3
    Dernier message: 05/05/2007, 09h12
  4. nombre de caractères par ligne à l'affichage
    Par trotters213 dans le forum Oracle
    Réponses: 3
    Dernier message: 03/11/2005, 09h51
  5. Réponses: 7
    Dernier message: 12/05/2003, 22h50

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