19/07/16 22:22
AldoBaldo
Ciao a te che leggi!
Per passatempo, sto mettendo insieme un programmino che gradirei potesse leggere dei file di testo trasferendone i contenuti in console senza fare troppo lo schizzinoso in termini di caratteri accentati, punteggiature bislacche, ecc. Ho cercato un po' qua e là in rete per scoprire se esistono metodi "standard" per poter usare in console i caratteri ASCII estesi (oltre 0-127, fino a 255), ma non ho avuto un gran successo. E va be'... trattandosi di un passatempo posso permettermi di fare esperimenti, quindi...
...quindi ho pensato di mettere insieme una tabella di conversione esplorando empiricamente le corrispondenze tra un set di caratteri completo 0-255 e il modo in cui quei caratteri vengono scritti in console. E vengo quindi alla domanda:
Il metodo qui sotto, può avere validità generale o per qualche ragione è efficace solo nell'ambiente particolare nel quale l'ho sviluppato e provato? (Code::blocks con MinGW, credo versione 3.20, su Windows 7)
Il file "file.txt" contiene lo stesso testo delle stringhe, ovvero:
Funziona o non funziona? Perché sì e perché no?
Forse per «l’umidità»? Ce n’è più che in pedalò!
Son certo che apprezzerai l'estro poetico del testo di prova...
Per passatempo, sto mettendo insieme un programmino che gradirei potesse leggere dei file di testo trasferendone i contenuti in console senza fare troppo lo schizzinoso in termini di caratteri accentati, punteggiature bislacche, ecc. Ho cercato un po' qua e là in rete per scoprire se esistono metodi "standard" per poter usare in console i caratteri ASCII estesi (oltre 0-127, fino a 255), ma non ho avuto un gran successo. E va be'... trattandosi di un passatempo posso permettermi di fare esperimenti, quindi...
...quindi ho pensato di mettere insieme una tabella di conversione esplorando empiricamente le corrispondenze tra un set di caratteri completo 0-255 e il modo in cui quei caratteri vengono scritti in console. E vengo quindi alla domanda:
Il metodo qui sotto, può avere validità generale o per qualche ragione è efficace solo nell'ambiente particolare nel quale l'ho sviluppato e provato? (Code::blocks con MinGW, credo versione 3.20, su Windows 7)
#include <stdio.h> #include <stdlib.h> #define XCONSOLE(c) c<128 ? c : XConsole[c-128] static const unsigned char XConsole[] = { // 16 per riga 128,129,39,102,34,133,43,135,136,137,83,60,140,141,90,143, // da 128 144,39,39,34,34,149,45,45,126,153,115,62,156,157,122,152, // da 144 255,173,189,156,207,190,221,245,249,184,166,34,170,45,169,238, // da 160 248,241,253,252,239,230,20,250,247,251,167,34,172,171,243,168, // da 176 183,181,182,199,142,143,146,128,212,144,210,211,222,214,215,216, // da 192 209,165,227,224,226,229,153,158,157,235,233,234,154,237,232,225, // da 208 133,160,131,198,132,134,145,135,138,130,136,137,141,161,140,139, // da 224 208,164,149,162,147,228,148,246,155,151,163,150,129,236,232,152 }; // da 240 int main() { const char *p; FILE *f; int c; if( (f=fopen("file.txt","r")) != NULL ) { printf( "\nDa file:\n\n" ); for( c=fgetc(f); c!=EOF; c=fgetc(f) ) printf( "%c", XCONSOLE(c) ); fclose( f ); } //////////////////////// printf( "\n\nDa stringa:\n\n" ); for( p="Funziona o non funziona? Perché sì e perché no?\n"; *p; ++p ) printf( "%c", XCONSOLE((unsigned char)*p) ); for( p="Forse per «l’umidità»? Ce n’è più che in pedalò!\n"; *p; ++p ) printf( "%c", XCONSOLE((unsigned char)*p) ); return 0; }
Il file "file.txt" contiene lo stesso testo delle stringhe, ovvero:
Funziona o non funziona? Perché sì e perché no?
Forse per «l’umidità»? Ce n’è più che in pedalò!
Son certo che apprezzerai l'estro poetico del testo di prova...
Ultima modifica effettuata da AldoBaldo 19/07/16 22:29
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.