Accueil > Forum > > > > Formater string C/C++ avec caractères spéciaux sous Linux
Formater string C/C++ avec caractères spéciaux sous Linux
mercredi 21 avril 2010 à 14:45:54 |
Formater string C/C++ avec caractères spéciaux sous Linux

zaraki21
|
Bonjour,
Je développe actuellement une application C/C++ sous Linux destinée a un périphérique électronique embarqué. Je dois dans l'implémentation écrire une fonction qui communique avec un écran LCD externe. Cette fonction doit obligatoirement prendre en paramètre d'entrée une chaîne de caractères qui va être ensuite stocker dans un message de type "unsigned char" pour être envoyé au LCD. Tout fonctionnait jusqu'à maintenant mais le problème désormais, est d'afficher des caractères spéciaux tel que Ä,ä ou encore ö, Ö. Ces dernier étant codés sur 2 octets, mon programme ne fonctionne plus correctement, les caractères ne sont pas affichés comme ils le devraient. Après plusieurs recherches sur Internet, j'ai vu qu'il fallait que j'utilise par exemple le type "wchar_t" mais seulement voila, je ne peux pas changer le type d'entrée qui est "string" et ne peux pas avoir recours aux fonctions (fonctions non reconnues dans mon application par le compilateur) tels que "swprintf" ou encore "mbstowcs". A noter que je travaille avec un répertoire de librairie restreint du fait du caractère embarqué de l'application. Donc si quelqu'un a une idée, merci.
Code de la fonction dans le cas ou cela fonctionne avec des caractères non spéciaux :
Code C/C++ : void LCD::writeLCDMessage(std::string sParameter){
size_t size = sParameter.size() + 1;
char * buffer = new char[ size ];
strncpy(buffer, sParameter.c_str(), size);
int sizeDisplay=0;
sizeDisplay = strlen(buffer);
unsigned char pDisplayMessage[sizeDisplay];
for(int i=0; i<sizeDisplay; i++){
pDisplayMessage[i]=buffer[i];
}
write(lcd,pDisplayMessage,sizeof(pDisplayMessage));
delete [] buffer;
}
|
|
mercredi 21 avril 2010 à 17:20:20 |
Re : Formater string C/C++ avec caractères spéciaux sous Linux

CptPingu
|
Librairie => bibliothèque (librairie est une grossière erreur de traduction du mot "library").
Tout d'abord, un petit problème qui n'a certes rien à voir, mais qui va te pourrir la vie: attention à la copie des arguments !
Ceci serait vraiment mieux:
Code C/C++ : void LCD::writeLCDMessage(const std::string& sParameter)
Tu gagne énormément en perf juste en faisant cela, sans incidence sur ton code. C'est encore plus flagrant en système embarqué !
Pour répondre à ton problème, tu peux utiliser: std::wstring et wchar_t. Normalement tu trouveras tout les fonctions nécessaires dans <cstdlib>. Si tu ne peux changer le std::string tu es très très mal. Il te faudra convertir ton std::string en std::wstring, et ce sera l'horreur.
Autre question: Tu ne peux pas faire: write(lcd, sParameter.c_str(), sParameter.size()); ?
_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
|
|
mercredi 21 avril 2010 à 19:39:16 |
Re : Formater string C/C++ avec caractères spéciaux sous Linux

zaraki21
|
Ok, merci pour les astuces et conseils de programmation. Tout d'abord au niveau du "write" avec lcd, non je dois faire comme j'ai fais avant car sinon il y a des problèmes d'affichages sur le LCD. Sinon à part ça je crois pas pouvoir changer string en wstring car en fait si tu veux le message est saisi bien un formulaire donc je sais pas. Enfin, je vais essayer d'utiliser <cstdlib> et voir ce que ça donne.
|
|
jeudi 22 avril 2010 à 18:06:39 |
Re : Formater string C/C++ avec caractères spéciaux sous Linux

zaraki21
|
En fait, je rencontre des problèmes pour l'utilisation de wstring ; en effet même en incluant <cstdlib>, le compilateur me met comme erreur "wstring in namespace std does not name a type" et je n'ai pas trouvé de solution à ce problème. J'ai aussi trouvé une fonction qui pourrait me permettre de faire ce que je veux c'est swprintf mais toujours pareil j'ai une erreur de compilation quand j'essaye de l'utiliser "swprintf was not declared in this scope" donc je suis un peu dans l'impasse. De plus, j'ai essayé sur un autre ordinateur d'utiliser ces deux éléments et cela fonctionne donc à mon avis il doit y avoir un problème au niveau du compilateur utilisé, je pense notamment à uclibc, tu en penses quoi ?
|
|
mardi 27 avril 2010 à 09:16:46 |
Re : Formater string C/C++ avec caractères spéciaux sous Linux

zaraki21
|
Réponse acceptée !
En fait, c'est bon j'ai trouvé un code sur le net pour transformer une "string" en "wchar_t" :
Code C/C++ : template <typename InputIterator,typename OutputIterator>
OutputIterator utf8_to_wchar_t(InputIterator begin,InputIterator end,OutputIterator result){
for (; begin != end; ++begin, ++result){
int count = 0; // the number of bytes in the UTF-8 sequence
unsigned c = (unsigned char)*begin;
unsigned i = 0x80;
if (c == 0xEF){
c = (unsigned char)* ++ ++ ++begin;
}
// Resynchronize after errors
while ((c & 0xC0) == 0x80){
c = (unsigned char)*++begin;
}
// Now we count the number of bytes in the sequence...
for (; c & i; i >>= 1){
++count;
}
// ...and strip the high-code-bits from the character value
c &= i - 1;
// Now we build the resulting wchar_t by appending all the character bits together
for (; count > 1; --count){
c <<= 6;
c |= (*++begin) & 0x3F;
}
// And we store the result in the output container
*result = c;
}
// The usual generic stuff
return result;
}
Après j'ai utilisé cette méthode en l'adaptant à mes besoins pour ainsi récupérer la "string" passée en paramètre dans un tableau "vector" de "wchar_t". Ensuite il a été facile de passer en "unsigned char" par la suite.
|
|
Cette discussion est classée dans : buffer, string, caractères, spéciaux, size
Répondre à ce message
Sujets en rapport avec ce message
Caractères spéciaux [ par redpooka ]
Comment faire je lis un fichier et je met son contenu dans une string, or quand je l'affiche les caractères spéciaux (é, ç...) ne marchent pas ? Comme
Traitement de Fichiers textes en C/C++ [ par devc26 ]
Bonjour, Je dois réaliser une "moulinette" en C/C++ permettant de modifier l'affichage de résultats en format texte ( contexte: Visual Studio 2003).C
conversion string et char, probleme [ par flowneo ]
Bonjour, soit le code suivant, qui convertit une chaine string en char: #include #include #include using namespace std; int main (){ string com
comment traiter une chaine de caractères séparée par espaces (String) [ par baptchr55 ]
Bonjour à tous, j'ai un nouveau problème. Je récupère une chaine de caractères dans un "[i]string[/i]", et je souhaiterais extraire ceux-ci mot par m
Caractères spéciaux [ par cjacquem ]
Bonjour à tous ! [^^happy13] Voilà, j'utilise Visual C++ 2008, et je voudrais faire afficher un delta (la lettre grecque) dans un CString. CString
caractères spéciaux [ par roukho ]
salut tous le monde mon problème est de faire écrire des caractères grec (unité fi et lambda) dans le code source pour quil doit être affiché en Edit
extraction des sous-chaine des caractères séparées par des virgules [ par OTHKREEN ]
bonjour à tous,j'ai un problème avec les chaines de caractères en C++.j'ai ecrit quelques instructions pour demander à un utilisateur d'entrer une cha
recherche d'une string délimité par des caractères [ par akiraofmoule ]
helloj'aimerais pouvoir récupérer un chaine de caractères délimités entre deux caractères simple (des guillement pour mon cas)exemple :string1 = "salu
conversion string hexa et décomposition string [ par pastaga29 ]
Je dispose d'un buffer de taille variable de type char*. Dans celui-ci se trouve une phrase. Je souhaiterais décomposer cette phrase en bloc de 20 car
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|