OVH Cloud OVH Cloud

conversion codage local vers ascii

63 réponses
Avatar
cedric
Une question simple et bête pour changer un peut de la taille des void*:

J'ai un programme qui parse des entêtes de mails, donc, de l'ASCII.
Par exemple, je cherche le caractère ascii du signe égual dans un
buffer. Or, rien ne me dit que je peu chercher le caractère C '=' car a
priori l'encodage local n'est pas nécessairement de l'ASCII. Le
programme cherche donc la valeur numérique de ce caractère (61).

Je me demande si toutes ces précautions ne sont pas exagérées, d'autant
qu'elles alourdissent le programme (surtout lorsqu'il faut chercher des
chaînes de caractères, case insensitive, l'horreur!).

Bref, connaissez vous beaucoup d'architectures encore vivantes qui
utilisent un autre encodage que l'ASCII et sur lesquelles tournent des
serveurs de mails ? Sinon, je remplace tout ça par des belles strings C
et je pourrai utiliser strcmp et consorts...

10 réponses

1 2 3 4 5
Avatar
Antoine Leca
En 4191da6a$0$7417$, cedric va escriure:
Sinon, si un serveur smtp codé en C et compilé avec un compilateur
pour qui l'encodage local est l'ebcdic, recoit un 61 sur un socket ( > en ascii), je ne voit pas trop comment il va deviner que ca
correspond au '=' du compilateur...


Bah, il suffit que le système (qui manipule les sockets comme bon lui
semble, il doit y avoir une raison pour laquelle un noyau Unix avec socket
est deux fois plus gros que le même sans socket) passe 126.
Et le tour est joué.


Antoine

Avatar
Pierre Maurette
"Antoine Leca" a écrit:

En , Pierre Maurette va escriure:
#if '=' == 61


Marche pas.
Dans la logique C, le préprocesseur est une chose, et le compilateur (et
donc la machine cible) en est une autre.
Et il se trouve qu'historiquement (et pour des raisons évidentes de
simplicité), les préprocesseurs croisés font les opérations (évaluer les
#if) dans leurs propres environnements, pas dans un environnement (simulé)
de la cible.
Idem pour les calculs en flottants au niveau du compilateur lui-même.
Tout ceci est permis par la norme.

Donc si tu utilises un compilo croisé vers la machine EBCDIC, mais opérant
sur une bécane Unix, tu va avoir '=' == 61 alors même que la cible est «
caca ».
M'étonne qu'à moitié. Pour avoir parcouru la norme sur les jeux de

caractères et le 8 étapes de la "traduction" :-(
D'ailleurs, pour les flottants, en y réfléchissant, c'est assez
logique.
Le principe "wait and see" reste valable. Je ne suis pas au fait des
chaînes "normales" de production, mais en cas de cross compilation, on
doit pouvoir imaginer une "debug" avec un test dans l'exe, ou un
assert(). On peut préparer le terrain en regroupant des constantes
caractères et chaînes et pouvoir ainsi "utiliser strcmp et
consorts...".
Il me semble que cedric s'interroge sur la pertinence d'une perte de
productivité en regard de la probabilité d'une non portabilité. Autant
je comprends son questionnement dans le cas présent, autant ça me fait
parfois sourire. Ici, le raisonnement est sain: la cible, ce sont les
plateformes susceptibles d'accueillir un serveur de courrier
électronique.
--
Pierre


Avatar
Antoine Leca
En , Pierre Maurette va escriure:
"Antoine Leca" a écrit:

#if '=' == 61


Marche pas.


Le principe "wait and see" reste valable.


Certes. Mais il faut l'écrire

if( '=' <> 61 )
appelle_le_dragon();

Un compilo normal (sur une cible ASCII) va repérer l'expression constante et
au pire va te sortir un avertissement intelligent disant que « du code n'est
jamais exécuté ». Bien sûr, le compilateur de Vincent va lui attendre la
phase d'exécution, au cas où.


Antoine



Avatar
Jean-Marc Bourguet
"Antoine Leca" writes:

if( '=' <> 61 )


Tu fais du Pascal pour le moment?

appelle_le_dragon();


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
Pierre Maurette
"Antoine Leca" a écrit:

En , Pierre Maurette va escriure:
"Antoine Leca" a écrit:

#if '=' == 61


Marche pas.


Le principe "wait and see" reste valable.


Certes. Mais il faut l'écrire

if( '=' <> 61 )
appelle_le_dragon();

Un compilo normal (sur une cible ASCII) va repérer l'expression constante et
au pire va te sortir un avertissement intelligent disant que « du code n'est
jamais exécuté ».
volatile const char groui = 61;

if( '=' != groui )
appelle_le_dragon();

(Le C, c'est casse-biroute. Voilà, c'est dit !)

Bien sûr, le compilateur de Vincent va lui attendre la
phase d'exécution, au cas où.
C'est kwa, le compilateur de Vincent ?

--
Pierre




Avatar
Antoine Leca
En , Jean-Marc Bourguet va escriure:
"Antoine Leca" writes:

if( '=' <> 61 )
Tu fais du Pascal pour le moment?



Mouais.
Y avait trop de signe =, cela ne me plaisait pas. Et avec le gag de changer
de clavier deux fois par jour, je craque. 8-/


Antoine


Avatar
Jean-Marc Bourguet
"Antoine Leca" writes:

En , Jean-Marc Bourguet va escriure:
"Antoine Leca" writes:

if( '=' <> 61 )
Tu fais du Pascal pour le moment?



Mouais.
Y avait trop de signe =, cela ne me plaisait pas. Et avec le gag de changer
de clavier deux fois par jour, je craque. 8-/


#include <iso646.h>
not_eq

:-)

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
Charlie Gordon
#include <iso646.h>
not_eq

:-)


Oui, quand j'ai découvert ce sommet de la branlette normatoire, je suis tombé de
ma chaise !
Pauvres drosophiles :-((

Chqrlie.

Avatar
Antoine Leca
En , Jean-Marc Bourguet va escriure:
#include <iso646.h>


Tss tss tss

%:include <iso646.h>

ou

??=include <iso646.h>


Et l'rev'là!


:-)))

Bon, c'était quoi, le sujet du fil, à propos. Ah oui, codage local ASCII...

Avatar
Emmanuel Delahaye
cedric wrote on 10/11/04 :
Heu... Oui sauf que là je parlais de parser des mails.
Or, les RFC sont précis : le contenu des headers des mails est encodé en
ASCII, et tant pis pour les mainframes. Donc, on ne cherche pas '=' mais bien
61... D'où mes soucis...


On peut supposer que sur mainframe IBM, il existe des fonctions de
conversions de chaines ebcdic2ascii() et inversement.

Il y a des serveurs smtp sur mainframes ? :-)


Aucune idée.

Ils doivent alors utiliser un fonction de conversion de string du
genre to_ascii(char *) ??


Probablement.

(à ce propos, je découvre qu'il existe une fonction C (BSD) qui s'appelle :
int toascii(int car);

et qui ... fait un and binaire avec 127 ! arf arf, rien à voir avec une
conversion ascii...


C'est assez rustique en effet. Disons que ça limite la valeur à
l'ensemble ASCII, soit 0-127.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

1 2 3 4 5