2012-10-16 35 views
7

stiamo utilizzando il servizio esterno per ottenere i dati in un formato CSV. stiamo cercando di scrivere i dati in risposta in modo che il CSV possa essere scaricabile sul client. sfortunatamente, stiamo ottenendo i dati nel formato seguente.Decodifica del simbolo Pound codificato in java

Amount inc. VAT  Balance 
£112.83    £0.0 
£97.55    £0.0 
£15.28    £0.0 

siamo in grado di decodificare il contenuto. C'è un modo per decodificare £ e visualizzare £ in java.

Esiste un numero di stringhe per decodificare le stringhe.

risposta

2

Problema: quando usiamo le getBytes() su stringhe, tenta di decodificare utilizzando l'encoder di default. una volta che la stringa è codificata, la decodifica potrebbe non funzionare bene se usiamo i decodificatori predefiniti.

Soluzione: uno StringUtilizzo di apache ci aiuterà a decodificare questi caratteri mentre si scrive alla risposta. Questa classe è disponibile nel pacchetto org.apache.commons.codec.binary.

String CSVContent = "/* CSV data */"; 
/** 
* Decode the bytes using UTF8. 
*/ 
String decodedStr = StringUtils.newStringUtf8(CSVContent.getBytes("UTF-8")); 
/** 
* Convert the decoded string to Byte array to write to the stream 
*/ 
Byte [] content = StringUtils.getBytesIso8859_1(decodedStr); 

Maven 2.0 dipendenza.

<dependency> 
    <groupId>commons-codec</groupId> 
    <artifactId>commons-codec</artifactId> 
    <version>1.6</version> 
</dependency> 

Soluzione: Due

Come da @Joni, migliore soluzione con l'API standard:

content = CSVContent.getBytes("ISO-8859-1"); 
+0

Lo stesso, più breve, con l'API standard: 'content = CSVContent.getBytes (" ISO-8859-1 ");' – Joni

+0

@Joni Questa è la soluzione migliore per il mio problema. Grazie. –

5

Il file sembra essere codificato in UTF-8. Dovresti leggerlo come UTF-8.

Se si utilizza java.io.FileReader e compagnia, si dovrebbe aprire un FileInputStream e utilizzare un InputStreamReader invece:

// Before: Reader in = new FileReader(file) 
Reader in = new InputStreamReader(new FileInputStream(file), "UTF-8"); 

Se si utilizza un altro metodo per la lettura del file (una libreria di classi esterno o interno, forse?), controllare nella documentazione se consente di specificare la codifica del testo utilizzata per leggere il file.

Aggiornamento: Se si dispone già di una stringa di mojibake come £97.55 e non può risolvere il modo in cui viene letto, in un modo di ricodifica è convertendo la stringa di nuovo in byte e re-interpretare i byte come UTF-8. Questo processo non richiede alcuna "StringUtils" esterna o libreria di codec; l'API standard Java è abbastanza potente:

String input = ...obtain from somewhere...; 
String output = new String(input.getBytes(/*use platform default*/), "UTF-8"); 
+0

Ho provato a leggere il file dalla macchina locale, ha funzionato bene. Ma dall'applicazione non decodifica correttamente. –

+0

@AnilKumarC Che applicazione intendi? Probabilmente la codifica dell'input di questa applicazione è interrotta. –

+0

@AnilKumarC Se non si specifica una codifica dei caratteri durante la lettura di un file, viene utilizzata la * codifica predefinita *. La codifica predefinita dipende dalla macchina su cui viene eseguito il programma, quindi puoi aspettarti di vedere risultati diversi su sistemi diversi. – Joni

1

Siamo fortunati ad avere Java 7 ora. È possibile effettuare le seguenti operazioni con Paths, Files, e StandardCharsets:

Path path = Paths.get("/tmp", "input.txt"); 
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8); 
for (String line : lines) { 
    System.out.println(line); 
} 
Problemi correlati