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 :

UTF-8 convertion implicite.


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut UTF-8 convertion implicite.
    Bonjour,

    je suis confronté a un problème d'UTF-8 que je ne comprend pas, et que je n'arrive pas a résoudre.

    Je dois copier en partie le contenu d'une chaîne buffer dans une autre donnee->radio.
    La copie s'arrête quand on tombe sur le caractère ';' .

    while ((donnee->radio[a++] = buffer[a++]) != ';');

    Cela fonctionne, mais a l'affichage de donnee->radio les caractères accentués pêchent.
    Si j' affiche buffer il n'y a pas de problèmes.

    Je précise que la fonction qui me permet d'afficher les caractères provient de la librairie GTK+ (gtk_combo_box_append_text), mais je poste ici comme le problème correspond plus au C qu'a GTK.

    En attente de vous lire, je vous remercie d'avance.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    C'est voulu le double ++ sur a ?

    MAT.

  3. #3
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut,

    Il s'agit de copier une chaîne encodée dans la locale vers une chaîne UTF-8?
    -> g_locale_to_utf8() effectue la converSion.

    Il s'agit de copier une chaîne UTF-8 vers une autre chaîne UTF-8?
    -> g_utf8_strncpy().

    Ces deux fonctions ne sautent pas les octets, même pour les caractères encodés sur plusieurs octets!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Je vais préciser.

    Je copie cette ligne (provenant d'un fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    France Inter;http://viphttp.yacast.net/V4/radiofrance/franceinter_bd.m3u;
    dans la chaîne 'buffer' avec fgets.
    Si j' affiche buffer, pas de problèmes d'encodage.

    Je veux récupérer la première entrée (France Inter) dans une chaîne contenue dans une structure référencé , je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((donnee->radio[a++] = buffer[a++]) != ';');
    Si j' affiche donne->buffer ça me donne : "F?a?c ?n" et je reçois cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pep:6740): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()
    OK, ça n'a pas l'air compliqué, bien que je ne comprenne pas (Mon système est en UTF-8).

    Je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((tampon[a++] = buffer[a++]) != ';');
    donnee->radio = g_locale_to_utf8(tampon, -1, NULL, NULL, NULL);
    donnee->radio = tampon;
    Et reçois cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (pep:6754): Gtk-CRITICAL **: gtk_combo_box_append_text: assertion `text != NULL' failed
    Bon voilà, désolé de faire du GTK alors qu'il y a un forum pour ça, mais la question qui me turlupine (tiens firefox connais !) c'est :
    Pourquoi lors d'une copie "char par char" j' obtiens des erreurs d'encodage ?

    EDIT : "bien que je ne comprenne pas (Mon système est en UTF-8)."
    Je ne nie pas n'avoir pas tout compris sur l'encodage des caractères.
    Si vous voulez m'expliquer, au cas ou j'ai dis une grosse bêtise, c'est le moment

  5. #5
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Ton système est UTF-8, très bien. Ca tombe bien car GTK+ travaille en UTF-8 en interne.
    La particularité de l'encodage UTF-8 est de coder un caractère non pas sur un seul octet,
    mais sur un ou plusieurs octets. Ca permet de gérer 65635 caractères, donc bénéficier
    de suffisamment de cases pour stocker plusieurs encodages (le russe, le vietnamien,
    les accents europe de l'ouest etc...), alors que l' ASCII de base n'a que 256 caractères.
    (Car codé sur un octet, je le répète. Comme un octet est stocké sur 8 bits il
    admet 2^8 possibilités, soit 256 possibilités).

    A présent il faut vérifier si le fichier lui-même est bel et bien encodé en UTF-8.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((donnee->radio[a++] = buffer[a++]) != ';');
    Mais puisqu'on te dit de ne pas sauter les octets!
    Le ++ est un opérateur d'incrémentation: il modifie la variable.
    Alors que buf[a+1] ne la modifie pas.

    Cette question intéresse plus les programmeurs GTK+ que C -> forum GTK+.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Merci pour ton explication; c'est plus clair tout de suite.

    Sinon je viens de corriger :

    while ((donnee->radio[a++] = buffer[a]) != ';');

    Et ça fonctionne parfaitement.


    Mat007 avait posé la bonne question mais je n'avais pas compris qu'il parlait du deuxième a.

    L'erreur est grossière, se sont souvent celles que l'on ne voit pas..
    Merci

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    En fait je copie aussi le point virgule.

    Je fait donc :

    while( ( cible [ a ] = source [ a ++] ) && ( ';' != source [ a ++] ) );


    et la c'est bon! ouf!

  8. #8
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Citation Envoyé par echantillon
    En fait je copie aussi le point virgule.

    Je fait donc :

    while( ( cible [ a ] = source [ a ++] ) && ( ';' != source [ a ++] ) );
    ( cible [ a ] = source [ a ++] ) renvoie toujours vrai.

    ce ne serait pas plus simple (et plus lisible) de faire un do { }while?

    genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int a=0;
    do
    {
    cible[a] = source[a];
    a++;
    }while(source[a] != ';');
    cible[a] = '\0'; /*caractere de terminaison pour les 'chaines' en C*/

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    vi, mais j'aime beaucoup me casser la tête a optimiser mon code.

    Sinon c'est sur que c'est de moins en moins lisible.

  10. #10
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    superbe optimisation ...
    avec ça tu gagne 1centieme de seconde sur 100'000 iterations (j'ai fait des benchs )
    et quand tu compile avec les parametres qui vont bien (-march=athlon64 -O2 -pipe -fomit-frame-pointer), il n'y as plus aucune difference ...

    optimiser c'est bien ... mais si tu veux etre capable de faire un projet de plus de 50 lignes qui tiens la route, ecris du code lisible, le compilo optimiseras (mieux que toi) a ta place.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 81
    Par défaut
    Je ne parlais pas d'optimiser pour la vitesse d'exécution, mais du simple plaisir parfois de chercher à compresser un maximum une expression.

    Dans certains cas c'est amusant comme un casse tête, je pense que tu peux comprendre ça.

    "optimiser c'est bien ... mais si tu veux etre capable de faire un projet de plus de 50 lignes qui tiens la route, ecris du code lisible"

    Je ne fais pas ce genre d'écart souvent et mon code est riche en commentaires clairs et indentés.

    En fait je suis assez maniaque alors ne t' inquiètes pas trop pour ça. ;°)

    EDIT :
    Et puis c'est une bonne manière pour moi de me mettre a l'aise avec le C. En jouant un peu avec le feu je me force a faire attention et ça clarifie ma compréhension des bases. Par la suite je fais moins de bêtises.

Discussions similaires

  1. Réponses: 15
    Dernier message: 07/06/2011, 22h42
  2. [Utilisation] Can't convert string from native encoding to 'UTF-8':
    Par vdumont dans le forum Subversion
    Réponses: 3
    Dernier message: 29/12/2010, 19h07
  3. Réponses: 6
    Dernier message: 20/08/2009, 16h06
  4. Réponses: 3
    Dernier message: 21/08/2008, 13h33
  5. Convertion implicite utf8 de la part d'Oracle ?
    Par Rakken dans le forum Administration
    Réponses: 11
    Dernier message: 27/11/2006, 10h26

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