Sign in to follow this  
zenZero

[C] lettura di lettere accentate da terminale

Recommended Posts

salve a tutti,

sto scrivendo un programma da linea di comando in C che ha a che fare con vocaboli della lingua italiana. il problema sono le maledettissime lettere accentate. dopo giorni e giorni di ricerche su google, credo (e sottolineo credo) di aver individuato il problema nel fatto che il terminale non legga le lettere accentate (e non il compilatore gcc come inizialmente pensavo). esiste un modo per far leggere al terminale i caratteri ascii estesi e quindi anche le lettere accentate?

compilo con xcode tools su mac os tiger 10.4.10.

Share this post


Link to post
Share on other sites

per non avere rogne con le accentate usa "unsigned char" al posto di char.

Per il terminale imposta la "codifica caratteri" come UTF-8, sotto Terminale-Impostazioni finestra-Aspetto

Share this post


Link to post
Share on other sites

sembra che ora riesca a far leggere i caratteri accentati alla mia applicazione

per non avere rogne con le accentate usa "unsigned char" al posto di char.

è stata la prima cosa che ho fatto, e, purtroppo, non ha funzionato.

Per il terminale imposta la "codifica caratteri" come UTF-8, sotto Terminale-Impostazioni finestra-Aspetto

questa era l'impostazione di default, ma, per poter leggere i caratteri accentati da terminale, ho dovuto sostituirla con OCCIDENTALE ISO latino 1

in questo modo, quando lancio l'applicazione da me creata e immetto caratteri accentati tutto fila liscio.

ma non so se questo è il modo corretto di procedere.

sono giorni che sto provando e riprovando (all'inizio pensavo fosse un problema del compilatore gcc, poi mi son reso conto che era il terminale...)

Share this post


Link to post
Share on other sites

In effetti acquisendo singoli caratteri da problemi, con stringhe invece no.

Non è che per caso la codifica Unicode (utf-8, http://it.wikipedia.org/wiki/UTF-8) prevede in caso di caratteri accentati più byte, che non entrano all'interno di un char, oppure un unsigned char, mentre non ci sono problemi con le stringhe?

L'ISO latin 1 è invece una codifica standard che fa rientrare alcune lettere accentate all'interno della mappa di 256 caratteri, rappresentabile facilmente con un byte.

Io la butto li', non programmo più da un bel po'...

Share this post


Link to post
Share on other sites

Che io sappia UTF-8 usa 8 bit, c'e' anche UTF-16 che ne usa 16.

Beh, quando ci sono lettere un po' strane (oltre il solito ASCII a 7bit su cui tutti sono d'accordo), i bit possono diventare anche 16 o 32 anche nell'UTF-8

Share this post


Link to post
Share on other sites

Beh, quando ci sono lettere un po' strane (oltre il solito ASCII a 7bit su cui tutti sono d'accordo), i bit possono diventare anche 16 o 32 anche nell'UTF-8

Secondo me nell'acquisizione %c il compilatore interpreta come char, quindi 7 bit, mentre nella %s interpreta unsigned.

Share this post


Link to post
Share on other sites

Secondo me nell'acquisizione %c il compilatore interpreta come char, quindi 7 bit, mentre nella %s interpreta unsigned.

Più o meno... se gli chiedi %c, il compilatore vuole un byte (signed o meno). Se gli rifili una sequenza di 4 byte, lui dove la mette? Mentre non c'è questo problema con le stringhe.

Il problema signed/unsigned esiste solo quando si fanno delle operazioni.

Share this post


Link to post
Share on other sites

ragazzi questa discussione si fa interessante. premetto che sono riuscito a far leggere i caratteri accentati modificando l'opzione file encoding di xcode da unicode a western latin 1. ho fatto la stessa identica cosa per il terminale. in questo modo i caratteri accentati vengono letti e interpretati correttamente.

ora però si è presentato il seguente problema.

il mio programma, come ho già detto, lavora con le stringhe. le stringhe le dichiaro di tipo char.

in questo modo posso utilizzare le funzioni della libreria string.h senza problemi.

il mio programma, ahimè, comprende anche una serie di funzioni che operano sui singoli char che compongono la stringa. quando devo fare delle verifiche sulle lettere accentate, succede che il compilatore mi ritorna degli errori poichè le lettere accentate fanno parte della tabella ascii estesa e quindi dovrei utilizzare un unsigned char per poter eseguire correttamente le verifiche sulle lettere accentate.

non posso dichiarare nemmeno i vettori come unsigned char, poichè in questo modo non potrei utilizzare le funzioni della libreria string.h che si aspettano di ricevere come argomento un unsigned char.

come posso procedere in questo caso?

Share this post


Link to post
Share on other sites

ragazzi questa discussione si fa interessante. premetto che sono riuscito a far leggere i caratteri accentati modificando l'opzione file encoding di xcode da unicode a western latin 1. ho fatto la stessa identica cosa per il terminale. in questo modo i caratteri accentati vengono letti e interpretati correttamente.

ora però si è presentato il seguente problema.

il mio programma, come ho già detto, lavora con le stringhe. le stringhe le dichiaro di tipo char.

in questo modo posso utilizzare le funzioni della libreria string.h senza problemi.

il mio programma, ahimè, comprende anche una serie di funzioni che operano sui singoli char che compongono la stringa. quando devo fare delle verifiche sulle lettere accentate, succede che il compilatore mi ritorna degli errori poichè le lettere accentate fanno parte della tabella ascii estesa e quindi dovrei utilizzare un unsigned char per poter eseguire correttamente le verifiche sulle lettere accentate.

non posso dichiarare nemmeno i vettori come unsigned char, poichè in questo modo non potrei utilizzare le funzioni della libreria string.h che si aspettano di ricevere come argomento un unsigned char.

come posso procedere in questo caso?

Se una funzione accetta char puoi provare a passare un unsigned char per vedere se opera correttamente. Il compilatore ti dara' un warning, ma non importa piu' di tanto.

Share this post


Link to post
Share on other sites

Se una funzione accetta char puoi provare a passare un unsigned char per vedere se opera correttamente. Il compilatore ti dara' un warning, ma non importa piu' di tanto.

Oppure fai uno di quei bei casting violenti che il C permette di fare quando necessario :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this