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?
risposta
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).
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
@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 –
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
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
Downvoted perché? –
Deve essere stato un errore di battitura, mi dispiace, è stato lasciato troppo tardi per annullare :( – Kieran
Hai provato:
BufferedReader r = new BufferedReader(new InputStreamReader("ISO-8859-1"))
...
s/b ISO-8859-15, non ISO-8859-1 – lavinio
Prova questa:
BufferedReader br = new BufferedReader(
new InputStreamReader(
ftp.getInputStream(),
Charset.forName("ISO-8859-15")
)
);
String row = br.readLine();
- 1. Come convertire facilmente un BufferedReader in una stringa?
- 2. Come convertire stringa esadecimale in stringa java
- 3. python: come convertire la stringa letterale in stringa raw letterale?
- 4. come convertire la stringa percentuale in BigDecimal?
- 5. Come convertire la stringa base64 in immagine?
- 6. Come convertire la stringa in controllo?
- 7. come convertire la stringa binaria in decimale?
- 8. Come convertire la stringa in long
- 9. Come convertire stringa da data a stringa in Swift iOS?
- 10. Come convertire PathBuf in stringa
- 11. Restituisce la stringa fino alla stringa corrispondente in Ruby
- 12. Come convertire la stringa in numero intero in UNIX
- 13. Come convertire JSON in stringa?
- 14. Come convertire BeautifulSoup.ResultSet in stringa
- 15. Come convertire uint32 in stringa?
- 16. convertire la stringa di DateTime
- 17. Restituisce stringa in DataHandler
- 18. Come convertire 'stringa binaria' in stringa normale in Python3?
- 19. Perl: convertire la stringa in riferimento?
- 20. convertire la stringa in data tipo python
- 21. convertire la stringa EBCDIC in formato ASCII?
- 22. Convertire la stringa con trattino in CamelCase
- 23. Come convertire una stringa Lua in float
- 24. Come convertire il char in stringa?
- 25. come convertire una stringa c in una stringa d?
- 26. come convertire caratteri come \ x22 in stringa
- 27. come convertire oggetto in stringa in PHP
- 28. come convertire stringa in byte [] in C#
- 29. Come convertire stringa in unicode in Android
- 30. Come convertire stringa in HashMap in Java
Non vedo come UTF-8 è coinvolto qui - Java utilizza UTF-16 internamente, non UTF-8. –
Siamo spiacenti, avrebbe dovuto dire UTF-16. Fisso. – tputkonen