[C] conversion

conversion [C] - C - Programmation

Marsh Posté le 10-09-2009 à 16:44:32    

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.

Reply

Marsh Posté le 10-09-2009 à 16:44:32   

Reply

Marsh Posté le 10-09-2009 à 18:22:53    

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).

Reply

Marsh Posté le 10-09-2009 à 20:04:36    

ou glib

Reply

Marsh Posté le 10-09-2009 à 20:07:25    

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
 

Reply

Marsh Posté le 10-09-2009 à 20:10:09    

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

Reply

Marsh Posté le 10-09-2009 à 21:14:38    

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ù ?

Reply

Marsh Posté le 10-09-2009 à 22:25:27    

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.

Reply

Marsh Posté le 10-09-2009 à 23:02:45    

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
Reply

Marsh Posté le 10-09-2009 à 23:19:51    

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

Reply

Marsh Posté le 11-09-2009 à 12:32:36    

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*/
}

Reply

Marsh Posté le 11-09-2009 à 12:32:36   

Reply

Marsh Posté le 11-09-2009 à 14:25:29    

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é!  --
Reply

Marsh Posté le 11-09-2009 à 15:50:09    

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.

Reply

Marsh Posté le 11-09-2009 à 16:34:31    

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é!  --
Reply

Marsh Posté le 11-09-2009 à 18:51:22    

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

Reply

Marsh Posté le 11-09-2009 à 19:50:45    

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é!  --
Reply

Marsh Posté le 11-09-2009 à 19:55:27    

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.

Reply

Marsh Posté le 11-09-2009 à 23:41:37    

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é!  --
Reply

Marsh Posté le 12-09-2009 à 01:18:47    

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.

Reply

Marsh Posté le 12-09-2009 à 10:17:04    

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é!  --
Reply

Marsh Posté le 12-09-2009 à 19:29:40    

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...

Reply

Marsh Posté le 14-09-2009 à 10:13:19    

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é!  --
Reply

Marsh Posté le 14-09-2009 à 16:39:50    

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

Reply

Marsh Posté le 17-09-2009 à 15:55:42    

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é.

Reply

Marsh Posté le 17-09-2009 à 16:05:57    

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
Reply

Marsh Posté le 17-09-2009 à 22:47:14    

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

Reply

Marsh Posté le 18-09-2009 à 11:52:16    

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


---------------
last.fm
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed