Un paio di considerazioni:
1) e' abbastanza improbabile che l'errore, se c'e' errore, avvenga SEMPRE sul bit alto.
2) piu' probabile, il bit e' settato in modo da avere il numero di bit a 1 in numeri PARI: controllo di errore
3) in ogni caso, il bit alto non serve a nulla, o quasi. SUPPONENDO che il testo sia in ASCII, basta estarre SOLO i primi 7 bit e impostare, o settare, il bit alto a 0.
Se funziona, si e' gia' a buon punto
Il giochino del char->int->char piu' o meno funziona. Il trucco e' questo (e' pseudocodice! NON codice in uno specifico linguaggio di programmazione)
string s = ...
char c;
for i=0 to length(s)-1:
c = s[i];
c = c & 0x7F;
s[i] = c;
end
L'operatore & e' l'operatore che applica l'AND binario a tutti i bit di c con la maschera fatta dal numebro binario "01111111", cio'e uno 0 e 7 bit a 1 (in esadecimante - base 16 - "7F").
---
Ho visto ora il codice Java. Puoi tentare questa strada:
...
char c = (char)r & 0x7F;
...
In alternatic, c'e' un'EVIDENTE relazione 1:1 (univoca) tra i caratteri strani e la corrispondente versione
in chiaro.
Quello che si puo' fare e' implementare, a mano, la mappa di conversione.
Al massimo sono 128 caratteri, in realta' saranno MOLTI meno di 70 (10 per le cifre, 26 per le minuscole, 26 per le maiuscole e qualche altro carattere come le parentesi, il percento, ...). Se poi non ci sono nemmeno le minuscole, la mappa si riduce ad una 40-na di caratteri. Probabilmente meno di 20
Per la lettura del file, MEGLIO LEGGERLO IN BINARIO, SENZA le conversioni fatte dall'encoding: si rischia che l'ENCODING faccia piu' danni che altro.