2009-07-01 7 views
7

Ho una classe client FTP che restituisce InputStream che punta il file. Mi piacerebbe leggere il file riga per riga con BufferedReader. Il problema è che il client restituisce il file in modalità binaria e il file ha la codifica ISO-8859-15.BufferedReader restituisce la stringa ISO-8859-15 - come convertire in stringa UTF16?

+0

Non vedo come UTF-8 è coinvolto qui - Java utilizza UTF-16 internamente, non UTF-8. –

+0

Siamo spiacenti, avrebbe dovuto dire UTF-16. Fisso. – tputkonen

risposta

21

Se il file/ruscello/Qualunque cosa contenga veramente testo codificato ISO-8859-15, è sufficiente specificarlo quando si crea InputStreamReader:

BufferedReader br = new BufferedReader(
    new InputStreamReader(ftp.getInputStream(), "ISO-8859-15")); 

Quindi readLine() creerà stringhe valide nella codifica nativa di Java (che è UTF-16, non UTF-8).

+0

Sono abbastanza sicuro che se non si utilizza il modulo del costruttore che richiede un argomento encoder, non solo una stringa o un set di caratteri, non si otterrà un'eccezione sull'input non valido. – tchrist

+0

@tchrist: stai parlando del costruttore ISR che accetta un argomento CharsetDecoder, vero? È vero che tutti gli altri operatori creano decodificatori che * sostituisce * caratteri non validi invece di generare eccezioni, ma non credo che un decodificatore ISO-8859-15 possa mai generare un'eccezione Ogni valore di byte possibile viene mappato su un carattere valido, e questo è l'unico modo in cui può rilevare malformato input –

+0

Sì, è vero, il problema è quando chiedi di UTF-8 e non lo ottieni - * e * non ottengono un'eccezione !! Analogamente per l'output, se tu (stupidamente) fai default alla piattaforma di default codifica ultra, che sul Mac sostituisce almeno punti di codice non modificabili con i caratteri '' ', di nuovo senza preavviso né eccezione. Sono abituato a un comportamento molto più sicuro con Perl in queste aree, e le impostazioni predefinite di Java sono semplicemente sbagliate. Tutta la nostra codebase (la parte Java, non la parte Perl) è piena di errori brutti a causa di questo. Quasi ti fa venire voglia di eseguire il patch delle librerie Java std. *Quasi*. ☺ – tchrist

1

La stringa originale è in ISO-8859-15, quindi il flusso di byte letto da InputStreamReader sarà in questa codifica. Quindi, leggi l'uso di tale codifica (specifica questo nel costruttore di InputStreamReader). Ciò indica a InputStreamReader che il flusso di byte in entrata è in ISO-8859-15 e per eseguire le conversioni da byte a carattere appropriate.

Ora sarà nel formato Java UTF-16 standard e potrai quindi eseguire ciò che desideri.

Penso che il problema attuale sia che lo stai leggendo usando la tua codifica predefinita (non specificando una codifica in InputStreamReader), e poi provando a convertirlo, quando ormai è troppo tardi.

L'utilizzo del comportamento predefinito per questo tipo di classi spesso finisce nel dolore. E 'una buona idea per specificare le codifiche ovunque è possibile, e/o di default la codifica VM tramite -Dfile.encoding

+0

Downvoted perché? –

+0

Deve essere stato un errore di battitura, mi dispiace, è stato lasciato troppo tardi per annullare :( – Kieran

0

Hai provato:

BufferedReader r = new BufferedReader(new InputStreamReader("ISO-8859-1")) 
... 
+0

s/b ISO-8859-15, non ISO-8859-1 – lavinio

9

Prova questa:

BufferedReader br = new BufferedReader(
         new InputStreamReader(
          ftp.getInputStream(), 
          Charset.forName("ISO-8859-15") 
         ) 
        ); 
String row = br.readLine(); 
Problemi correlati