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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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