2012-12-14 8 views
5

ho a che fare con un servizio esterno web che mi sta dando modo errato codificato (e o danneggiati) Corde (UTF-8) che erano più probabile sia ISO LATIN o WINDOWS-1252 ma sono ora UTF-8 (e o una miscela di ISO/WINDOWS/UTF-8). I cappelli Lovely A (Â) abbondano.libreria Java per risolvere in modo non corretto il testo codificato usando euristiche

Ovviamente non è possibile risolvere il modo in cui il servizio Web esterno memorizza le stringhe in modo da perdere le informazioni. Quindi le speranze di una traduzione al 100% che conosco non sono possibili.

Ma speravo che qualcuno avesse scritto una libreria di mappatura dei caratteri euristica in Java (è improbabile che qualcuno possa digitare A cappelli).

Se non Credo di poter porta questo ragazzi codice PHP: https://stackoverflow.com/a/3521340/318174

UPDATE e spiegazione: una semplice conversione come @VGR risposto con non funzionerà. Non ho i byte originali. I dati sono stati convertiti in modo errato sull'endpoint (il server SOAP potrebbe essere stato getBytes(/*with out correct encoding*/) o forse i dati sono stati memorizzati nel formato non corretto). Quando convertite i byte in stringhe in Java, i dati non vengono conservati a meno che la codifica non sia la stessa ovunque. Questo è facile da capire se pensi a qualcosa come ASCII < ->UTF-8. Con Windows-1252 o ISO Latin è molto più complicato perché i dati non vengono persi, ma spesso confusi. Questo perché tali codifiche possono essere due byte e non sono un sottoinsieme di UTF-8.

Se non mi credi, puoi provare a fare getBytes() indietro con varie codifiche e vedrai la corruzione dei dati e la perdita di dati.

+0

non dovrei lasciare che mi dà fastidio, ma mi infastidisce sempre quando qualcuno voti per chiudere con la scrittura di un commento. –

risposta

0

Potrei essere frainteso la natura dei dati codificati erroneamente, ma il codice PHP mi sembra eccessivo. Se si dispone di byte UTF-8 che sono stati passati come singoli caratteri, si dovrebbe essere in grado di fare solo:

String fix(String s) { 
    byte[] bytes = s.getBytes(Charset.forName("windows-1252")); 
    return new String(bytes, StandardCharsets.UTF_8); 
} 
+0

Questo non funziona perché i dati sono già corrotti. Se avessi i byte originali, allora funzionerebbe. Credetemi quello che avete elencato è qualcosa di cui sono molto consapevole. –

+0

@AdamGent Questo è ciò che fa il codice PHP ... anche se dovrebbe usare Windows-1252 invece di ISO-8859-1. Puoi mostrare un esempio di ciò che hai e di ciò che dovrebbe essere? – Esailija

+0

Hai ragione; codice aggiornato. Stavo pensando che tutti i byte UTF-8 sono anche caratteri ISO-8859-1 validi, ma non è questo il caso. – VGR

Problemi correlati