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

C Discussion :

[libiconv] conversion en unicode


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut [libiconv] conversion en unicode
    Bonjour,

    J'ai un fichier audio contenant un tag id3v1. L'encodage des informations (artiste, album, ect...) du tag est en windows-1251 (cyrilique). J'aimerais convertir gràce à la bibliotèque libiconv ces informations en unicode.

    Avant de parler du code j'aimerais déjà comprendre une chose.
    C'est très bien de convertir ça en unicode mais un char c'est généralement 1 octet, or en unicode il y a plus d'un octet pour coder un caractère. Donc comment vais-je pouvoir gérer ça en C ?

    Voici mon essai de code pour utiliser libiconv (la partie pour récupéré le tag fonctionne):
    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
    #include <stdio.h>
    #include <id3.h>
    #include <iconv.h>
     
    #define NB_CHAR_IN 1024
    #define NB_CHAR_OUT 8192
     
    int main(void)
    {
    	ID3Tag *p_my_tag;
    	ID3Frame *p_my_frame;
    	ID3Field *p_my_field;
     
    	char album[NB_CHAR_IN];
    	char album_unicode[NB_CHAR_OUT];
     
    	size_t input=NB_CHAR_IN, output=NB_CHAR_OUT;
     
    	iconv_t my_conv;
     
     
    	p_my_tag = ID3Tag_New();
    	ID3Tag_Link(p_my_tag, "Romashki.mp3");
     
    	p_my_frame = ID3Tag_FindFrameWithID(p_my_tag, ID3FID_ALBUM);
     
    	p_my_field = ID3Frame_GetField(p_my_frame, ID3FN_TEXT);
     
    	ID3Field_GetASCII(p_my_field, album, 1024);
     
     
    	printf("Album en CP1251: %s\n", album);
     
     
    	my_conv = iconv_open("CP1251", "UTF-8");
     
    	iconv(my_conv, &album, &input, &album_unicode, &output);
     
     
    	printf("Album en Unicode: %s\n", album_unicode);
     
     
    	iconv_close(my_conv);	
     
    	ID3Tag_Delete(p_my_tag);
     
     
    	return 0;
    }
    gcc me retourne
    translate.c: In function `main':
    translate.c:34: attention : passage de l'argument n°2 de « iconv » d'un type pointeur incompatible
    translate.c:34: attention : passage de l'argument n°4 de « iconv » d'un type pointeur incompatible
    La ligne 34, c'est la ligne de la fonction iconv.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    tu DOIS passer l'adresse d'un pointeur à iconv() : Passer directement un tableau n'est pas accepté.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par oFlex
    La ligne 34, c'est la ligne de la fonction iconv.
    iconv() attend des char en parametres 2 et 4, pas des unsigned char.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Citation Envoyé par DaZumba
    iconv() attend des char en parametres 2 et 4, pas des unsigned char.
    Oui c'est juste, j'avais mis des non signés pour faire un autre test et j'ai oublié de les retirer.


    Sinon Médinoc, je comprend pas trop, ici je passe pas directement le tableau, mais l'adresse du tableau, non ?

    Merci pour vos réponses ;-)

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par oFlex
    Oui c'est juste, j'avais mis des non signés pour faire un autre test et j'ai oublié de les retirer.
    Ah. Donc gcc ne se plaint plus, n'est-ce pas?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Citation Envoyé par DaZumba
    Ah. Donc gcc ne se plaint plus, n'est-ce pas?

    euh si

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Je viens de rajouter deux printf pour vous montrer ce que ça donne à l'exécution, moi ça me dit rien mais peut-être que vous oui.

    Album en CP1251: Земфира
    translate: gconv.c:58: __gconv: Assertion `outbuf != ((void *)0) && *outbuf != ((void *)0)' failed.
    Abandon

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Le problème est règlé maintenant ça foncionne. Donc en fait c'est certainement ce que tu expliquais Médinoc.
    A la place de déclarer des tableaux de caractère j'ai déclarer des pointeurs de caractère et j'ai donc passé leur adresse.

    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
    #include <stdio.h>
    #include <id3.h>
    #include <iconv.h>
     
    #define NB_CHAR_IN 1024
    #define NB_CHAR_OUT 8192
     
    int main(void)
    {
    	ID3Tag *p_my_tag;
    	ID3Frame *p_my_frame;
    	ID3Field *p_my_field;
     
    	char *p_album;
    	char *p_album_unicode;
     
    	size_t input=NB_CHAR_IN, output=NB_CHAR_OUT;
     
    	iconv_t my_conv;
     
     
    	p_album = (char *) malloc(NB_CHAR_IN);
     
    	p_my_tag = ID3Tag_New();
    	ID3Tag_Link(p_my_tag, "Romashki.mp3");
     
    	p_my_frame = ID3Tag_FindFrameWithID(p_my_tag, ID3FID_ALBUM);
     
    	p_my_field = ID3Frame_GetField(p_my_frame, ID3FN_TEXT);
     
    	ID3Field_GetASCII(p_my_field, p_album, NB_CHAR_IN);
     
    	printf("Album en CP1251: %s\n", p_album);
     
     
    	my_conv = iconv_open("CP1251", "UTF-8");
     
    	iconv(my_conv, &p_album, &input, &p_album_unicode, &output);
     
    	printf("Album en Unicode: %s\n", p_album_unicode);
     
    	iconv_close(my_conv);
     
     
    	ID3Tag_Delete(p_my_tag);
     
     
    	return 0;
    }
    Par contre mainetant j'aimerais savoir comme afficher ma chaine car avec un printf classique ça ne fonctionne pas.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Ne passe pas l'adresse de pointeurs alloués par malloc(), tu ne pourras plus faire de free() correctement...

    Mon conseil: Garde tes buffers fixes, mais crée des pointeurs vers le début de chacuns de ces buffers, et passe les adresses de ces pointeurs...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 19
    Par défaut
    Donc en fait tu me dis qu'il faut faire comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	char album[NB_CHAR_IN];
    	char album_unicode[NB_CHAR_OUT];
    	char *p_album;
    	char *p_album_unicode;
     
    	p_album = album;
    	p_album_unicode = album_unicode;
    Et donc je passerais les adresses de p_album et p_album_unicode, c'est ça ?

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Je pense que oui.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Conversion ansi unicode
    Par Oscar02 dans le forum Windev Mobile
    Réponses: 1
    Dernier message: 09/05/2014, 14h37
  2. Conversion vers unicode
    Par Papy214 dans le forum Développement
    Réponses: 3
    Dernier message: 08/03/2012, 11h59
  3. Conversion chaine unicode vers float
    Par Nako_lito dans le forum Développement
    Réponses: 3
    Dernier message: 02/09/2008, 14h54
  4. conversion vers UNICODE
    Par ak_wassim dans le forum Langage
    Réponses: 1
    Dernier message: 17/01/2008, 19h29
  5. conversion ASCII Unicode
    Par zais_ethael dans le forum C++
    Réponses: 8
    Dernier message: 04/08/2006, 02h44

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