Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1734 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] conversion

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] conversion

n°1923023
matiew
Posté le 10-09-2009 à 16:44:32  profilanswer
 

Bonjour, voila j'aurai aimé savoir s'il était possible de convertir une chaine de caractères en iso 8859-1, car le probléme est que étant sous linux tout les caractères é à etc.. deviennent des caracères bizare.
 
Merci pour l'aide que vous pourrez m'apporter.

mood
Publicité
Posté le 10-09-2009 à 16:44:32  profilanswer
 

n°1923089
tpierron
Posté le 10-09-2009 à 18:22:53  profilanswer
 

Ok, je devines. Tu scannes un dossier avec des noms comportants des é, à, è, ç, ... et quand tu affiches ça, tu vois des caractères "bizarres", genre é pour é.
 
Bon, il y a 200% de chance pour que ta chaine soit encodé en UTF-8, et si tu l'affiches à coup de printf, c'est clair que tu vas avoir des trucs bizarres à l'écran.
 
Si j'étais toi je convertirais plutôt la chaine en wchar_t et j'utiliserais wprintf. La conversion utf-8 => wchar_t est relativement triviale (http://en.wikipedia.org/wiki/UTF-8#Description), où tu peux utiliser la lib iconv (un peu lourdingue cela dit).

n°1923102
Taz
bisounours-codeur
Posté le 10-09-2009 à 20:04:36  profilanswer
 

ou glib

n°1923104
matiew
Posté le 10-09-2009 à 20:07:25  profilanswer
 

Enfaite je ne scan pas de dossier j'ai juste codé un programme qui intéragit avec différent type d'utilisateur, et eu quand le prog  leur envoy un message les é à etcc on des caractères bizares
 

n°1923107
matiew
Posté le 10-09-2009 à 20:10:09  profilanswer
 

Sinon il n'y aurait pas un moyen de remplacer les codes hexadecimal de la chaine utf par les code hexa de iso?

n°1923121
tpierron
Posté le 10-09-2009 à 21:14:38  profilanswer
 

matiew a écrit :

Enfaite je ne scan pas de dossier j'ai juste codé un programme qui intéragit avec différent type d'utilisateur, et eu quand le prog  leur envoy un message les é à etcc on des caractères bizares


 
Oué, faut être un peu plus précis. Interagit avec quoi ? Console ? Xlib ? GTK ? Tu veux afficher / transmettre ça où ?

n°1923131
matiew
Posté le 10-09-2009 à 22:25:27  profilanswer
 

Enfaite c'est une application IRC qui répond à des demandes effectuées par les utilisateurs connectés sur le server. Je tranmet les message grace à la fonction send(), grace a une connexion socket.

n°1923137
tpierron
Posté le 10-09-2009 à 23:02:45  profilanswer
 

matiew a écrit :

Enfaite c'est une application IRC qui répond à des demandes effectuées par les utilisateurs connectés sur le server. Je tranmet les message grace à la fonction send(), grace a une connexion socket.


 
Donc c'est lorsque tu affiches ces messages quelque part que tu voies ces caractères "bizarres". Et c'est là qu'on a besoin de savoir l'API que tu utilises, car la méthode n'est en général pas la même. Avec printf, il faut passer par wchar_t, GTK et QT doivent supporter UTf-8 en natif, la Xlib ça doit être de l'UCS-2 (c'est pas utf-16, ni wchar_t), etc...


Message édité par tpierron le 10-09-2009 à 23:03:05
n°1923138
matiew
Posté le 10-09-2009 à 23:19:51  profilanswer
 

j'utilise pas gtk ni qt ni sdl simplement les headers comme stdlib.h de l'api C

n°1923275
matiew
Posté le 11-09-2009 à 12:32:36  profilanswer
 

je vien de trouver la fonction mbstowcs() qui peut palier à mon probléme mais elle me renvoy toujours (size -1)  
 
code :  
 
  wchar_t * wchaine = (wchar_t *)malloc(strlen(chaine+1);
   
   if (mbstowcs(wchaine, chaine,strlen(chaine)) == (size_t) -1) {
 
  */soucie*/
}

mood
Publicité
Posté le 11-09-2009 à 12:32:36  profilanswer
 

n°1923321
gilou
Modérateur
Modzilla
Posté le 11-09-2009 à 14:25:29  profilanswer
 

Citation :

If mbstowcs successfully converts the source string, it returns the number of converted multibyte characters. If the wcstr argument is NULL, the function returns the required size of the destination string. If mbstowcs encounters an invalid multibyte character, it returns –1. If the return value is count, the wide-character string is not null-terminated.


 
si tu faisais d'abord un requiredSize = wcstombs( NULL, chaine, 0);
puis un wchaine = (unsigned char *)malloc( requiredSize + 1);
et size = wcstombs( wchaine , chaine, requiredSize + 1);
 
Bref, si tu faisais comme c'est parfaitement indiqué dans la première page de résultat retournée par Google pour "mbstowcs"? :pfff:  
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923347
matiew
Posté le 11-09-2009 à 15:50:09  profilanswer
 

je sais j'avais déjà essayé et j'en revien à la meme chose. la fonction est mbstowcs
 
pas wcstombs sinon les valeurs seront pas compatible.et puis caster un wchar_t * avec unsigned char * c quand meme moyen, avant de faire des réflexion genre tes meilleur que tout le monde regarde tes posts.
 
merci quand meme.

n°1923370
gilou
Modérateur
Modzilla
Posté le 11-09-2009 à 16:34:31  profilanswer
 

Autant pour moi, je n'ai pas copié et adapté la bonne section de la page, mais ce n'est pas bien dur a faire:

Citation :

/* Assume we don't know the length of the multibyte string.
     Get the required size in characters, and allocate enough space. */

 

   requiredSize = mbstowcs(NULL, pmbhello, 0); // C4996
    /* Add one to leave room for the NULL terminator */
    pwc = (wchar_t *)malloc( (requiredSize + 1) * sizeof( wchar_t ));
    if (! pwc)
    {
        printf("Memory allocation failure.\n" );
        return 1;
    }
    size = mbstowcs( pwc, pmbhello, requiredSize + 1); // C4996

 

Donc on adapte ce que je disais:
si tu faisais d'abord un requiredSize = mbstowcs( NULL, chaine, 0);
puis un wchaine = (wchar_t *)malloc((requiredSize + 1) * sizeof( wchar_t ));
et size = mbstowcs( wchaine , chaine, requiredSize + 1);
vraiment très dur a faire :sarcastic:
A+,


Message édité par gilou le 11-09-2009 à 16:35:10

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923401
matiew
Posté le 11-09-2009 à 18:51:22  profilanswer
 

Je suis déjà sur la page http://msdn.microsoft.com/en-us/library/k1f9b8cy.aspx (celle que tu consulte) et ça ne marche pas je me demande si sa à pas un rapport avec la localisation

n°1923414
gilou
Modérateur
Modzilla
Posté le 11-09-2009 à 19:50:45  profilanswer
 

Bon alors:
Déjà, quelle est le format de tes données en entrée: UTF-8 ou UTF-16 ou autre? (wchar c'est de l'UTF-16 pour windows)
Quel est le format qu'il te faut pour tes données en sortie?
A partir de ces infos on pourra progresser, mais sinon on ne fait que discourir dans le vide.
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923420
matiew
Posté le 11-09-2009 à 19:55:27  profilanswer
 

en entrée, sa dépend de l'utilisateur , dépend s'il est sous linux ou windows a la base l'entrée est en utf-8 et la sortie doit être de l'unicode ou de l'iso meme si il on pas vraiment décart.

n°1923514
gilou
Modérateur
Modzilla
Posté le 11-09-2009 à 23:41:37  profilanswer
 

Citation :

la sortie doit être de l'unicode ou de l'iso meme si il on pas vraiment décart

Bien sur que si qu'il y en a, et pas qu'un peu. J'ai pas l'impression que l'unicode soit une notion bien claire pour toi. L'unicode, c'est un modèle, mais dans la pratique, ce qu'on manipule, c'est un encodage de ce modèle, et il y en a pas qu'un seul, d'encodage. L'unicode ca peut être en général de l'UTF-8, ou de l'UTF-16 (et il y en a d'autres: UTF-7, UTF-32, UCS-2, UCS-4, etc) Le seul moment ou ça coincide avec l'ANSI (et pas l'Isolatin 1 8859-1) c'est quand on est en UTF-8. A partir du 128e caractere, en UTF-8, on n'est plus codé sur un octet mais sur 2 ou plus. C'est sur qu'avec les langages de programmation qui parlent d'unicode, au lieu de préciser quel encodage (pour java, c'est de l'UTF-16 en interne par exemple) ça peut induire en confusion.
 
Donc en sortie, il va falloir choisir ton encodage, car il n'y en a pas qui satisfassent à tout:
Soit tu es en Isolatin 1 8859-1, c'est un codage de taille fixe sur 1 octet.
Soit tu es en UTF-8, c'est un codage de taille variable sur 1, 2, 3 ou 4 octets.
Soit tu es en UTF-16, c'est un codage de taille variable sur 2, 4 octets (que pour des raisons pratiques, on peut approximer comme un codage de taille fixe sur 2 octets).
 
Perso, j'utiliserais une librairie ad-hoc pour ce genre de choses, comme la librairie ICU d'IBM, elle est un poil complexe, mais elle sait tout faire dans le domaine des conversions.
Sinon, tu as la solution de poser ta locale comme UTF-8 pour l'entrée (mais es tu bien sur que c'en est?) et convertir en wchar (donc UTF-16) avec les fonctions évoquées, puis d'envoyer en sortie (si tu veux de l'utf-16) ou de poser ta locale comme Isolatin 1 et de convertir en char (avec wcstombs) et d'envoyer en sortie (si tu veux de l'isolatin 1).
 
A+,
 


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923528
matiew
Posté le 12-09-2009 à 01:18:47  profilanswer
 

j'ai testé l'encodage du  system je sais que c'est de l'utf-8 en deux l'unicode est pas si différent de iso simplement unicode est définit comme un charset iso l'ai aussi oui est non et au final c'est un encodage (pour preuves les 256 premiers caractères sont les même)  bref ma question est, est-ce possible de faire une conversion de caractères sans passé par une librairie que je vais devoir installer?
 
car mbstowcs ne fonctionne pas du tout d'ailleur je me demande bien pourquoi  il n'on pas fait un encodage de caractères du style unicode dés le départ... bref sinon ya pas moyen de changé juste les valeurs héxa dans la chaine de caractères puis dans remettre une autre genre celle de unicode.
 
T'a l'air d'en savoir quand meme plus que moi.. éclair moi s'il te plait.

n°1923550
gilou
Modérateur
Modzilla
Posté le 12-09-2009 à 10:17:04  profilanswer
 

Citation :

en deux l'unicode est pas si différent de iso simplement unicode est définit comme un charset iso l'ai aussi oui est non et au final c'est un encodage (pour preuves les 256 premiers caractères sont les même)

Faux et faux, comme je te l'ai dit.  
1) L'unicode n'est pas un encodage.  
2) L'encodage UTF-8 de unicode et celui de l'isolatin 1 coincident sur les 128 premiers caracteres [0-127], car ils sont codés sur un octet, mais pas au dela, parce qu'après, en UTF-8, les caractères entre 128 et 255 sont sur 2 octets, tandis que ceux en isolatin 1 restent sur 1 octet.
Donc oui, comme liste de caractères, ca coincide sur les 256 premiers d'unicode, mais leur représentations informatiques (encodages donc) ne coincident pas elles.
 

Citation :

est-ce possible de faire une conversion de caractères sans passé par une librairie que je vais devoir installer?

Tu peux faire ca a la main si ca te chante, tant que tu es sur que tu ne sors pas des caracteres du jeu isolatin 1.
Entre 0 et 127, on a une équivalence entre isolatin 1 et UTF-8: représentation 0xxxxxxx (ou les x sont des bits)
entre 128 et 255, on a une correspondance: Isolatin 1: 1yxxxxxx  <---> 1100001y 10xxxxxx :UTF-8
(En UTF-8, si on a un octet qui démarre par un bit 0, on a une représentation sur 1 octet, si ca démarre par des bits 110, on a une représentation sur 2 octets (le suivant devant démarrer par des bits 10), si ca démarre par des bits 1110, on a une représentation sur 3 octets (les 2 suivants devant démarrer par des bits 10), si ca démarre par des bits 11110, on a une représentation sur 4 octets (les 3 suivants devant démarrer par des bits 10))
A+,


Message édité par gilou le 12-09-2009 à 10:22:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923643
matiew
Posté le 12-09-2009 à 19:29:40  profilanswer
 

je pensai plus a changé les valeurs hexadecimal de la chaine de caractères contre les valeurs héxa de iso
 
Possible je pense mais comment...

n°1923822
gilou
Modérateur
Modzilla
Posté le 14-09-2009 à 10:13:19  profilanswer
 

Citation :

changé les valeurs hexadecimal de la chaine de caractères contre les valeurs héxa de iso


J'aurais pourtant pensé que c'était clair.

Citation :

Tu peux faire ca a la main si ca te chante, tant que tu es sur que tu ne sors pas des caracteres du jeu isolatin 1.
Entre 0 et 127, on a une équivalence entre isolatin 1 et UTF-8: même représentation 0xxxxxxx (ou les x sont les bits)
entre 128 et 255, on a une correspondance: Isolatin 1: 1yxxxxxx  <---> 1100001y 10xxxxxx :UTF-8


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1923989
matiew
Posté le 14-09-2009 à 16:39:50  profilanswer
 

A oui mince j'avais pas capté sur le moment merci.

n°1924836
matiew
Posté le 17-09-2009 à 15:55:42  profilanswer
 

enfaite quand on convertie un char en chiffre on obtient pour le caractère ceci:  
195  
169 �
on retrouve 195 avant chaque caractère à accent alors jlé tout simplement viré.  
 
jvai juste vérifié que le 195 correspondent pas à une autre lettre dans un  encodage de caractère différent  sinon pour moi c résolu merci pour tes réponse gilou et tes explications, ça ma bcp aidé.

n°1924842
theshockwa​ve
I work at a firm named Koslow
Posté le 17-09-2009 à 16:05:57  profilanswer
 

Gilou t'a tout expliqué :
 
195 == 11000011
c'est le premier octet, si tu reprends son exemple, tu places le y à 1 et c'est exactement ca que tu obtiens


---------------
last.fm
n°1924942
matiew
Posté le 17-09-2009 à 22:47:14  profilanswer
 

oui, t'en fait pas j'avais compris, c'était juste pour la récap pour les autres, mais merci :)

n°1925025
theshockwa​ve
I work at a firm named Koslow
Posté le 18-09-2009 à 11:52:16  profilanswer
 

arf, ok, ca m'apprendra à lire en diagonale


---------------
last.fm
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] conversion

 

Sujets relatifs
[C++] Probleme de Makefile/linkageconversion binaire -> decimal
[Résolut]liaison Ada avec un .o C[C++] Cherche lib + howto pour utiliser le pilote wifi (linux)
[Résolut]Conversion d'un base 10 en base 16accès à fonction importée à accè à fonction importé.
Conversion JPEG -> BMP en C++[Visual C++] Problème conversion System::String ^ et structure
[C] Conversion Hexa vers ASCII[C] conversion fichier binaire Big-Little Endian [RESOLU]
Plus de sujets relatifs à : [C] conversion


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR