begin process at 2012 05 29 11:56:05
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

Formater string C/C++ avec caractères spéciaux sous Linux


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS
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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,920 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales