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 :

conversion Unicode -> ASCII


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 26
    Points : 24
    Points
    24
    Par défaut [resolu]conversion Unicode -> ASCII
    salut, je suis en train de (essayer de) réaliser une fonction qui converti une chaine Unicode en ASCII.
    J'ai compris le codage unicode, mais je tombe sur un pb tout bete :
    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
     
    	while(*srcPt!='\0'){
    		if(*srcPt>0x7F){
    			printf("SUPERIEUR");
    		}
    		if(*srcPt< 0x7F){
    			printf("0x%x ",*srcPt);
    			*dstPt=*srcPt;
    			srcPt++;
    			dstPt++;
    		}
    		else {
    			srcPt++;
    			*dstPt=0xC0 + (*srcPt-0x80);
    			srcPt++;
    			dstPt++;
    		}
    	}
    meme si le char pointé par srcPt est > a 0x7F, ca n'ecrit jamais "superieur" alors que si on remplace *srcPt par par exemple 0xffffffc3 (c'est une des valeur imprimée par le second printf), ca marche ...

    J'ai aussi repéré un truc bizarre, c'est que le second printf me renvoie 1 ou 4 octet, selon que le caractère soit respectivement "normal" (<127) ou non.

    D'ou mes 2 questions :
    - si qq'un a deja cette fonction sous le coude, je suis preneur.
    - pourquoi le test *srcPt< 0x7F ne fonctionne pas?

    merci

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    srcPt, c'est un pointeur sur quoi ?
    Attention à bien utiliser unsigned.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    J'crois qu'HW a raison, srcPt est de type char*?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    oui, il s'agit bien de char *.
    mais je ne comprends pas pourquoi unsigned (ni ou).
    Il faudrait mettre des unsigned char *?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juillet 2002
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Je voudrais que tu nous expliques un peu plus :

    Par exemple tu dis que 0xffffffc3 est une valeur affichée par le deuxieme printf donc 0xffffffc3 <0x7F ?

    c la que je comprend pas! D'un coté y'a une donnée sur 4 octets et de l'autre 1 octet.
    Je n'ai pas pu ecrire ton code, le compiler et tester. Je n'ai pas de compilo sur mon poste de bureau.

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par viddak
    Par exemple tu dis que 0xffffffc3 est une valeur affichée par le deuxieme printf donc 0xffffffc3 <0x7F ?
    En C 0x7F est egal a 0x0000007F donc la comparaison est possible par contre si tu travaille sur des nombre signe, 0xFFFFFFC3 est negatif (le premier bit vaut 1) et 0x7F est positif donc on a bien 0xffffffc3 <0x7F

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    c'est pour cela qu'il faut mettre les pointeurs en unsigned char, plutot qu'en char. Merci a tous.
    pour ceux que ca interresse, voici le code :
    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
    +void unicode2ascii(char *dst, char *src)
    {
    	int i;
    	unsigned char *srcPt=src;
    	unsigned char *dstPt=dst;
     
    	while(*srcPt!='\0'){
    		if(*srcPt< 0x007F){
    			printf("0x%x ",*srcPt);
    			*dstPt=*srcPt;
    			srcPt++;
    			dstPt++;
    		}
    		else if(*srcPt>0x0080 && *srcPt<0x07FF){
    			printf("double : 0x%x ",*srcPt);
    			*dstPt=(*srcPt&0x1f)<<6;
    			srcPt++;
    			*dstPt+=*srcPt&0x3f;
    			srcPt++;
    			dstPt++;
    		}else{
    			printf("triple : 0x%x ",*srcPt);
    			*dstPt=(*srcPt&0xf)<<12;
    			srcPt++;
    			*dstPt+=(*srcPt&0x3f)<<6;
    			srcPt++;
    			*dstPt+=*srcPt&0x3f;
    			dstPt++;
    		}
    	}
    	*dstPt='\0';
    	printf("\n");
    	}

  8. #8
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 749
    Points : 10 666
    Points
    10 666
    Billets dans le blog
    3
    Par défaut
    je suis quand même intrigué :
    En unicode, dans le cas de chaînes simples avec notre alphabet, chaque lettre ASCII est séparée par un \0 ...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 26
    Points : 24
    Points
    24
    Par défaut
    en fait, c'est de l'UTF-8, mais je n'ai pas bien saisi la nuance entre les deux.
    En tout cas, ce que tu dis n'est pas valable pour l'UTF8, puisque l'algo que j'ai donné marche (la definition est ici : http://java.sun.com/products/jdk/1.2/docs/guide/jni/spec/types.doc.html#16542). Par contre, il s'agit d'un contexte assez particulier, puisque c'est du JNI (code C/C++ appelé par du Java) et les chaînes que je converti sont crées a partir de jstring (chaine java native) avec la fonction GetStringUTFChars.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/09/2014, 12h59
  2. conversion UNICODE -> ASCII
    Par juniorAl dans le forum C#
    Réponses: 5
    Dernier message: 19/05/2010, 23h09
  3. Conversions Unicode Ascii
    Par Klaim dans le forum C++
    Réponses: 25
    Dernier message: 01/08/2007, 22h15
  4. Conversion de chaine ASCII->Unicode
    Par zzorglub dans le forum C
    Réponses: 6
    Dernier message: 04/04/2007, 13h35
  5. Problème de conversion unicode
    Par djmalo dans le forum C
    Réponses: 5
    Dernier message: 09/03/2004, 11h48

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