Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Saisie directe d'un code de caractère dans une chaîne

7 réponses
Avatar
Pierre Maurette
Bonjour,
J'édite sous Windows, et parfois la cible est en fenêtre "Invite de
commandes", les jeux de caractères étendus sont différents. Mais la
question porte sur la syntaxe, elle est générale.

Ce que je fais parfois:
#ifdef _OEM_
const char entree[] = "entr,e\n";
#else
const char entree[] = "entrée\n";
#endif
(J'édite le source une fois dans la fenêtre "Invite de commandes" pour
saisir "entr,e"\n", mais je trouve ça un peu bourrin).

Je voudrais rester dans mon éditeur. Ce qui fonctionne:
#ifdef _OEM_
const char entree[] = {'e', 'n', 't', 'r', 0x82, 'e', '\n', 0};

C'est un peu long, si les chaînes le sont. ce que je voudrais faire (à
peu près):
#ifdef _OEM_
const char entree[] = "entr\x82e\n";

Ça ne fonctionne pas comme souhaité. (la sortie est la même que
"entr.\n").
Y a-t-il une solution ?
(je précise que saisir "entr'e\n" sous Windows ne fonctionne
évidemment pas ;-)).
Merci d'avance
--
Pierre

7 réponses

Avatar
Pierre Maurette
Pierre Maurette a écrit:

Bonjour,
J'édite sous Windows, et parfois la cible est en fenêtre "Invite de
commandes", les jeux de caractères étendus sont différents. Mais la
question porte sur la syntaxe, elle est générale.

Ce que je fais parfois:
#ifdef _OEM_
const char entree[] = "entr,en";
#else
const char entree[] = "entréen";
#endif
(J'édite le source une fois dans la fenêtre "Invite de commandes" pour
saisir "entr,e"n", mais je trouve ça un peu bourrin).

Je voudrais rester dans mon éditeur. Ce qui fonctionne:
#ifdef _OEM_
const char entree[] = {'e', 'n', 't', 'r', 0x82, 'e', 'n', 0};

C'est un peu long, si les chaînes le sont. ce que je voudrais faire (à
peu près):
#ifdef _OEM_
const char entree[] = "entrx82en";

Ça ne fonctionne pas comme souhaité. (la sortie est la même que
"entr.n").
Y a-t-il une solution ?
(je précise que saisir "entr'en" sous Windows ne fonctionne
évidemment pas ;-)).
Ooooops !

(je précise que saisir "entr,en" sous Windows ne fonctionne
évidemment pas ;-)).
--
Pierre

Avatar
Richard Delorme
Bonjour,
J'édite sous Windows, et parfois la cible est en fenêtre "Invite de
commandes", les jeux de caractères étendus sont différents. Mais la
question porte sur la syntaxe, elle est générale.

Ce que je fais parfois:
#ifdef _OEM_
const char entree[] = "entr,en";
#else
const char entree[] = "entréen";
#endif
(J'édite le source une fois dans la fenêtre "Invite de commandes" pour
saisir "entr,e"n", mais je trouve ça un peu bourrin).

Je voudrais rester dans mon éditeur. Ce qui fonctionne:
#ifdef _OEM_
const char entree[] = {'e', 'n', 't', 'r', 0x82, 'e', 'n', 0};

C'est un peu long, si les chaînes le sont. ce que je voudrais faire (à
peu près):
#ifdef _OEM_
const char entree[] = "entrx82en";


Le problème est que e est un chiffre héxadécimal, et qu'il lit 0x82e.
Les parades existent :

const char entree[] = "entrx82" "en";
ou
const char entree[] = "entru0082en";

--
Richard

Avatar
Pierre Maurette
Richard Delorme a écrit:

Bonjour,
J'édite sous Windows, et parfois la cible est en fenêtre "Invite de
commandes", les jeux de caractères étendus sont différents. Mais la
question porte sur la syntaxe, elle est générale.

Ce que je fais parfois:
#ifdef _OEM_
const char entree[] = "entr,en";
#else
const char entree[] = "entréen";
#endif
(J'édite le source une fois dans la fenêtre "Invite de commandes" pour
saisir "entr,e"n", mais je trouve ça un peu bourrin).

Je voudrais rester dans mon éditeur. Ce qui fonctionne:
#ifdef _OEM_
const char entree[] = {'e', 'n', 't', 'r', 0x82, 'e', 'n', 0};

C'est un peu long, si les chaînes le sont. ce que je voudrais faire (à
peu près):
#ifdef _OEM_
const char entree[] = "entrx82en";


Le problème est que e est un chiffre héxadécimal, et qu'il lit 0x82e.
Les parades existent :

const char entree[] = "entrx82" "en";
Youpi, ça ka maché !

Fatalement, on peut également faire:
const char entree[] = "entrx82x65n";
(ça fait un peu bricolage, tout rentre dans l'ordre quand on tombe sur
autre chose que a,b,c,d,e,f,A,B,C,D,E,F,0,1,2,3,4,5,6,7,8,9)

ou
const char entree[] = "entru0082en";
Ça, c'est pour les wchar et l'UTF-16 ?

Merci,
--
Pierre


Avatar
Antoine Leca
En , Pierre Maurette va escriure:
const char entree[] = "entrx82" "en";



Plus long mais un poil plus lisible

#define eaigu "x82"

const char entree[] = "entr" eaigu "en";

(On peut aussi coller plus à SGML et écrire eacute ;-))


ou
const char entree[] = "entru0082en";
Ça, c'est pour les wchar et l'UTF-16 ?




Non, mais c'est exclusivement C99, et il y a pas mal de chance (sous
Windows) pour que cela ne fonctionne pas...

La version pour les wchar (qui est C90, d'ailleurs, mais les versions les
plus anciennes, disons <95, des compilos de Borland sont un peu bornées)
serait :

const wchar_t entree[] = L"entrxE9" L"en";

Et on retrouve le même problème qu'en 8 bits (avec en plus la nécessité
d'ajouter un second L, ce qui fait que cela devient très ch***t, surtout
quand on utilise ma variante; C99 donne la possibilité d'omettre le second
L, mais encore une fois, il faut avoir le compilo qui va bien).


Antoine


Avatar
Pierre Maurette
"Antoine Leca" a écrit:

En , Pierre Maurette va escriure:
const char entree[] = "entrx82" "en";



Plus long mais un poil plus lisible

#define eaigu "x82"

const char entree[] = "entr" eaigu "en";

(On peut aussi coller plus à SGML et écrire eacute ;-))
J'avais fait quelques tentatives dans ce sens. J'avais même tenté un

calamiteux:
const char[] verb_etre = "blabla";

const char entree[] = "entru0082en";
Ça, c'est pour les wchar et l'UTF-16 ?




Non, mais c'est exclusivement C99, et il y a pas mal de chance (sous
Windows) pour que cela ne fonctionne pas...
Je confirme, mais sans que ça ne prouve quoi que ce soit: la seule

copie de norme C que j'ai est la C99, et je n'ai aucun compilo C99 !
Peut-être gcc 3.4.1 ? En tout cas, la preview du Borland 6.0 ne
fonctionne absolument pas.
Je me pose la question sérieusement: adopter C99 est-il une démarche
vers la portabilité ?

Pour être pragmatique, j'ai adoté une autre méthode:
*
#include "chaines.h"

avec:

<chaines.h>
#if !defined(chaines_H)
#define chaines_H

/*
* chaines.h
*
* Constantes chaînes de caractères,
* à éditer dans les environnements cibles
*
* Constantes chaŒnes de caractŠres,
* … ‚diter dans les environnements cibles
*/

#ifdef _OEM_
/* A ‚diter "sous DOS" */
const char str_usage[] "La ligne de commande doit ˆtre
exactement: n TestC <source>
<snip>
const char str_ErrIn[] = "entr‚en";
const char str_ErrOut[] = "sortien";
const char str_longues_lignes[] "Il a été d‚tect‚ %d ligne(s) trop longue(s)";
#else
/* A éditer "sous Windows" */
const char str_usage[] "La ligne de commande doit être
exactement: n TestC <source>
<snip>
const char str_ErrIn[] = "entréen";
const char str_ErrOut[] = "sortien";
const char str_longues_lignes[] "Il a été détecté %d ligne(s) trop longue(s)";
#endif /* _OEM_ */
#endif /* chaines_H */

<chaines.h>

C'est assez pratique. J'ouvre de temps en temps une fenêtre "Invite de
commade" et je fais:
edit chaines.h

J'aurais pu faire chainesWin.h et chainesOEM.h, mais c'est plus
compliqué à synchroniser. Je vais voir si j'ai quelque chose de simple
en utilisant des .rc
--
Pierre



Avatar
Jean-Marc Bourguet
Pierre Maurette writes:

J'aurais pu faire chainesWin.h et chainesOEM.h, mais c'est plus
compliqué à synchroniser.


J'aurais bien vu un petit programme faisant la transformation
automatiquement.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Antoine Leca
[ Fait faire rugir les passerelles, moi... Et en plus, c'est plutôt HS ]

En , Pierre Maurette va escriure:

C'est assez pratique. J'ouvre de temps en temps une fenêtre "Invite de
commade" et je fais:
edit chaines.h


Hmmm... Tu es sous Win32, exact ? Regarde si tu peux mettre la main sur un
portage de sed (n'importe quelle version: j'en ai une de 49K); Ensuite lis
la doc
(http://www.freebsd.org/cgi/man.cgi?query=sed&apropos=0&sektion=0&manpath=Un
ix+Seventh+Edition&format=html), en particulier la commande
y/source-cars/cars-remplacement/... y/.f?,S/àâçéè/. Pour le oe, il faut
utiliser s/// sur deux lignes différentes, une pour la minuscule, l'autre
pour la majuscule. Idem si tu veux traiter UTF-8 ou HTML.

Évidemment, perl, awk, etc., font cela très bien aussi. Il y a même un
utilitaire Unix, tr, qui ne fait QUE cela (la commande y):
http://www.freebsd.org/cgi/man.cgi?query=tr&apropos=0&sektion=0&manpath=Unix
+Seventh+Edition&format=html; mais il est un peu plus difficile à trouver
pour Win32 (et c'est un filtre).


Antoine