Newsgroup: it.comp.lang.c
Titolo: Problema con socket e lettere accentate...

Allora,
Ho costruito un semplice programma in C che permette di mandare delle email
(effettua una connessione SMTP).
Il programma funziona perfettamente, ma ho riscontrato un problema con
l'invio di lettere accentate come "è", "à", "ò", ecc.
Nel messaggio che viene spedito dal programma infatti, le lettere accentate
non arrivano in modo corretto, ma al loro posto vengono visualizzati altri
simboli. Questo problema non si pone quando uso i caratteri standard, che
arrivano in modo corretto.
Da cosa può dipendere questo problema?
Come posso risolverlo?
Grazie a tutti coloro che leggeranno/risponderanno.
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

Ciao.
Non dipende dal socket.
Cosi' a naso.. hai impostato i relativi header del messaggio smtp?
se il server si aspetta un messaggio contenente ascii a 7 bit e'
normale riscontrare questo tipo di problema.


 (effettua una connessione SMTP).
Rivolgiti a un gruppo specifico sulla programmazione per il sistema
operativo che stai utilizzando.

 normale riscontrare questo tipo di problema.
Err...
Credo di non aver impostato gli header che dici tu :(
Al server mando questi comandi:
helo
MAIL FROM
RCPT TO
DATA
messaggio...
.
QUIT
Che altro devo inserire?



Il programma deve funzionare su Windows e Unix (e tutt'ora funziona), e
visto che si tratta di C, mi sembra corretto postare in questo gruppo, non
in un altro.
Grazie lo stesso per l'aiuto :)


 Come posso risolverlo?
Probabilmente è l'encoding/charset
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Comunque non è il ng giusto... a memoria cerca l'rfc 1521

 l'invio di lettere accentate come "?", "?", "?", ecc.
Quoto queste righe del tuo messaggio. Li vedi quei punti di domanda? Il
mio reader vede che sono dei caratteri non ASCII ma nei tuoi header non
dici cosa sono (latin1, iso-*, ecc) e quindi non sa come visualizzarli.
La stessa cosa avviene con le email. Roberto ti ha dato un hint su cosa
manca e Andrea ti ha fatto correttamente notare che questo non e` il
gruppo adatto.
Hint: guarda gli header del mio messaggio
àèéòìù
Luca
-- 
Home: 
http://kronoz.cjb.net
"I've seen things you people wouldn't believe...
 Attack Ships on fire off the shores of Orion.
 I've watched C-beams glitter in the dark off of Tanhauser Gate.
 All those moments will be lost in time...like tears, in rain.
 Time to die." -- Roy Batty (played by Rutger Hauer)

 Comunque non è il ng giusto... a memoria cerca l'rfc 1521
Scusatemi per la mia inesperienza...
Le informazioni sul Content-Type le devo inviare al server appena mi
connetto giusto?
Oppure da qualche altra parte?



E in quale gruppo devo discutere di un problema che riguarda un programma
scritto in C?


scritto in C?
   Poniti questa domanda, anche in base ai consigli che hai gia`
ricevuto: il problema sarebbe diverso, se il programma fosse scritto
in Basic o Algol? Se risponderai correttamente, ti accorgerai che non
e` un problema di C.
-- 
S.L.


Ma questo lo so...
Ma visto che la soluzione vi sembra (e sicuramente č) tanto facile, perchč
non cercate di aiutare un niubbo programmatore di C come me invece di
attaccarlo con i vostri messaggi?
Rimando questo messaggio alla mia domanda iniziale: "Qualcuno sa per caso
come visualizzare le lettere accentate in un'email inviata per mezzo di un
programma scritto in C"?


 attaccarlo con i vostri messaggi?
Nessuno ti  sta attaccando, ti  e` semplicemente stato detto  che questo
non e` il posto giusto per la discussione, ti e` stata data la soluzione
e  ti  e` anche  stato  detto  dove cercare  ulteriori  informazioni. E,
aggiungo, gli header vanno tra gli header della mail.
Luca
-- 
Home: 
http://kronoz.cjb.net
Se non puoi convincerli, confondili.

 Luca
L'header è da aggiungere, ma non mi è stato detto COME aggiungerlo.
Per spiegare meglio... sono da aggiungere queste informazioni:
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Peccato che... se li aggiungo... questi bei header vengono inseriti nel
corpo del messaggio!
Quindi... qualcuno sà dirmi in maniera completa e chiara come e dove devo
inserire questi header?


 Oppure da qualche altra parte?
La domanda di riserva giusta poteva essere:
scusa, ma qual'è il ng giusto per sapere come smallopparsi 'sto
problema?
La risposta è: non lo so quando mi servirà/sarò ispirato me lo
cerco.
Tagliando corto perchè non è il posto giusto per discuterne:
SMTP già lo sai usare.
Adesso manca:
RFC 822, 2822 formato email
Le informazioni sul Content-Type le devi inviare tra i DATA secondo il
formato specificato negli RFC di cui sopra.
RFC 1521 MIME (che in realtà c'entra poco)
una buona libreria per passare da un encoding all'altro eventualmente.
Su *nix e forse c'è anche un porting Win c'è recode
Poi torna e discutiamo dell'implementazione in C

 L'header ? da aggiungere, ma non mi ? stato detto COME aggiungerlo.
Ti e` stato detto tutto quello che c'e` da dire. Pappa pronta? Hai
sbagliato posto.
^K
Luca
-- 
Home: 
http://kronoz.cjb.net
Software is like sex; it's better when it's free.
Linus Torvalds

 Luca
Sono io che non so usare 
http://www.google.it
 oppure sei tu che non sai
rispondermi? Se non sei in grado di aiutarmi, evita certi post "inutili".
Grazie lo stesso :)



Perfetto! Cercherò di vedere se riesco a combinare qualcosa con queste
informazioni.
Grazie sergio!!!


 in un altro.
Ti sembra male: in questo gruppo si tratta di aspetti legati al C
standard, non aspetti legati allo sviluppo sotto determinate
piattaforme.  Il tuo problema *NON RIGUARDA* il C standard, quindi
*SEI PREGATO* di spostarti su un altro gruppo.  Rivolgiti, come già
detto, in it.comp.programmare.win32 e/o it.comp.os.linux.development.

 detto, in it.comp.programmare.win32 e/o it.comp.os.linux.development.
Ho gia ricevuto un'esaustiva risposta da parte di sergio riguardo al mio
problema. E vorrei ricordarvi che anche se ho sbagliato area, non è mica
vietato rispondere :)


 vietato rispondere :)
E' vietato chiedere, secondo il manifesto: è diverso.


Suppongo che mi arriverą un ingiunzione dal tribunale per aver postato in un
area che tratta di un argomento diverso. :)
Ti prego di postare nuovamente solo per dare una soluzione o un aiuto per
risolvere il mio problema. Evitiamo di arricchire questo thread con messaggi
inutili. Grazie.


 inutili. Grazie.
Apri le orecchie: OGNI GRUPPO DI DISCUSSIONE POSSIEDE UN TOPIC.
Ti prego di postare nuovamente solo se hai domande che sono IN TOPIC
con questo gruppo.
Guardati bene dal dire altre idiozie.

 Guardati bene dal dire altre idiozie.
Oh, ma non ti sarai mica offeso vero?
Comunque stai certo che posterò in un altro gruppo, visto che in questo gira
certa gente poco disposta ad aiutare ;)


> Oh, ma non ti sarai mica offeso vero?
Offeso ?! e per che cosa ? mi sa che ad "offenderti" sei stato proprio
tu.
Se vuoi essere aiutato, leggi i manifesti dei gruppi e rivolgiti nei
posti giusti.
Nessuno č disposto ad aiutare chi non sa a chi e come rivolgersi.
In quanto alla gente presente in questo gruppo, pena peccare ancora di
grande maleducazione, dai uno sguardo tutti i post trascorsi in questo
gruppo e poi vediamo se la gente "non č disposta ad aiutare".
Quando l'avrai fatto, ne potremo riparlare.

 inutili.
Tipo (quasi) tutti quelli che hai inviato finora in questo NG?
C:\>iao Angelo


 Tipo (quasi) tutti quelli che hai inviato finora in questo NG?
No, tipo quello che hai appena inviato.


 No, tipo quello che hai appena inviato.
Pienamente d'accordo. Risponderti e' un'attivita' assolutamente inutile,
visto il tuo livello di comprensione.
C:\>iao Angelo
P.S. Com'e' che nel rispondere a me non hai messo neanche una faccina?
     Ti e' passata la paresi o ti sei accorto di passare per ebete?
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 persa...
idem....
non capisco perche' la gente arrivi cosi' presto ad essere maleducata.... Ci
sono cose ben piu' gravi al mondo... Se ve la prendete cosi' tanto per
queste.....
Tommy

 sono cose ben piu' gravi al mondo...
Questo sicuramente, ma perche', tra una catastrofe ecologica e un
infame commercio di organi provenienti da bambini africani, non
prendersi uno sfizio (ogni tanto) e sfanculare il minchione di turno?
Le catastrofi rimangono, per 5 minuti non ci si pensa.
Un pezzo del post diretto a Tofy che ho tagliato prima dell'invio
(e colgo l'occasione) era
"E' difficile trovare troll del tuo calibro, anche in NG molto piu'
turbolenti di questo. Quasi quasi ti ringrazio di esistere".
Il fatto di comportarsi da deficiente su un NG, puo' sicuramente
donare agli altri un momento di svago. Per se stessi e' abbastanza
contro producente: per quanto mi riguarda cerchero' di evitare
"contatti" futuri con il soggetto.
A costo di sembrare presuntuoso, non credo di essere cosi' scarso con
il "C" da non poter dare un suggerimento di tanto in tanto.
Le mie scuse al NG, per quanto riguarda il Tofy confermo parola
per parola quello che ho detto: e' un cretino.
Fine della polemica con il soggetto (per quello che mi riguarda).
C:\>iao Angelo


Nonostante questa accesa discussione, ho trovato la via per la soluzione
(grazie ancora per la risposta di sergio...).
Il testo dell'email va convertito (subject compreso) in modo tale che i
caratteri speciali vengano convertiti in formato esadecimale.
Utilizzando un messaggio email spedito con outlook express ho preso le
informazioni corrette per l'header.
Per convertire il testo dell'email ho utilizzato una semplice funzione che
mi permetto di postare...
char *convert_to_mime(char *string, int maxlength, int change_spaces){
 char *buffer;
 char ch;
 char hex[2];
 int count,pointer;
 int len=strlen(string);
 int value;
 buffer=malloc(sizeof(char)*(maxlength*2));
 for (count=0, pointer=0; count<len; count++, pointer++){
  ch=string[count];
  value=256+ch;
  if (value>=256){
   if (change_spaces && ch==' ') ch='_';
   buffer[pointer]=ch;
  }else{
   sprintf(hex,"=%X",value);
   buffer[pointer]=hex[0];
   buffer[pointer+1]=hex[1];
   buffer[pointer+2]=hex[2];
   pointer+=2;
  }
 }
Oltre a questo, bisogna definire nell'header dell'email i valori:
Content-Type: text/plain;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
In questo modo l'email viene correttamente visualizzata.
Ringrazio tutti, anche coloro che sono stati un po' sgarbati e mi scuso se
sono andato troppo OT.


> [...]coloro che sono stati un po' sgarbati
Di cui tu sei il primo.


Precisamente.


   sprintf(hex,"=%X",value);
   [1]
-- 
S.L.

 
p.es
.
Ho messo maxlength*2 e non *3 perchè alla funzione non viene mandata una
singola lettera ('è'), ma viene mandata una stringa (il messaggio
dell'email). In un comune messaggio di testo non si trovano più che tanti
caratteri estesi... dici che dovrei mettere 3? Potrebbe influire sulla
velocità dell'esecuzione del programma se cambio da 2 a 3?
P.S. Ho corretto gli altri errori che ho fatto nella funzione.


C'č un altro problema...
Si provi ad eseguire questo programma.
----------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *convert_to_mime(char *string, int maxlength, int change_spaces);
int main(void){
char buffer[40];
printf("%s (CORRETTO)\n",convert_to_mime("č stato cosě.",40,0));
printf("Adesso digita la stessa frase: ");
fgets(buffer,40,stdin);
printf("%s (SBAGLIATO)\n",convert_to_mime(buffer,40,0));
return 0;
}
char *convert_to_mime(char *string, int maxlength, int change_spaces){
 char *buffer;
 char ch;
 char hex[2];
 int count,pointer;
 int len=strlen(string);
 int value;
 buffer=malloc(sizeof(char)*(maxlength*2));
 for (count=0, pointer=0; count<len; count++, pointer++){
  ch=string[count];
  value=256+ch;
  if (value>=256){
   if (change_spaces && ch==' ') ch='_';
   buffer[pointer]=ch;
  }else{
   sprintf(hex,"=%X",value);
   buffer[pointer]=hex[0];
   buffer[pointer+1]=hex[1];
   buffer[pointer+2]=hex[2];
   pointer+=2;
  }
 }
 buffer[pointer-1]='\0';
 return buffer;
}
------------------------------
Quando viene richiesto di inserire un testo, inserire la stringa "č stato
cosě." (per confrontare i due output).
Quando si richiama direttamente la funzione passandogli come argomento "č
stato cosě." la stringa viene codificata correttamente, quando si cerca di
passargli un valore preso dall'input invece la codifica in modo sbagliato...


    buffer[pointer+2]=hex[2];
attenzione! hai dichiarato hex come un array di 2 caratteri..
nella linea sopra, tu leggi un carattere oltre i limiti dell'array
-- 
                Roberto Nunnari -software engineer-
                     mailto:
ro...@nunnisoft.ch
 
http://www.nunnisoft.ch
   Residenza Boschetto 12           tel/fax: 
+41-91-6046511
   6935 Bosco Luganese        """    mobile: 
+41-76-3208561
   Switzerland               (o o)
========================oOO==(_)==OOo========================

velocitа dell'esecuzione del programma se cambio da 2 a 3?
   Sulla velocita` no, l'importante e` che, quando non gli serve piu`,
il chiamante invochi 'free' sul buffer allocato.
   Se vuoi risparmiare memoria, allora fai un calcolo piu` preciso in
due passate, nella prima passata conti i caratteri da convertire e
nella seconda allochi un buffer grande esattamente quanto ti serve.
-- 
S.L.

fgets(buffer,40,stdin);
   A me andava in errore qui, ma si e` risolto correggendo le
dimensioni di hex[].
-- 
S.L.