2012-12-14 17 views
5

mam do czynienia z zewnętrznym usługi internetowej, która daje mi nieprawidłowo zakodowany (i lub uszkodzone) Struny (UTF-8), które były najprawdopodobniej albo ISO LATIN lub WINDOWS-1252 ale teraz UTF-8 (i lub mieszanina ISO/WINDOWS/UTF-8). Piękne kapelusze (Â) obfitują.biblioteki Java, aby naprawić nieprawidłowo zakodowany tekst za pomocą heurystyki

Oczywiście nie mogę ustalić, w jaki sposób zewnętrzna usługa sieciowa przechowuje ciągi, aby informacje zostały utracone. Tak więc nadzieje na 100% tłumaczenie, które znam, nie są możliwe.

Ale miałem nadzieję, że ktoś napisał heurystyczną bibliotekę odwzorowań postaci w Javie (jest mało prawdopodobne, że ktoś mógłby ją wpisać).

Jeśli nie myślę, że może to faceci portu kod PHP: https://stackoverflow.com/a/3521340/318174

UPDATE i Objaśnienie: Prosta konwersja jak @VGR odpowiedział nie będzie działać. Nie mam oryginalnych bajtów. Dane zostały niepoprawnie przekonwertowane w punkcie końcowym (serwer SOAP prawdopodobnie wykonał getBytes(/*with out correct encoding*/) lub może dane są przechowywane w niewłaściwym formacie). Podczas konwersji bajtów na ciągi znaków w języku Java z powrotem dane nie są zachowywane, chyba że kodowanie jest wszędzie takie samo. Jest to łatwe do zrozumienia, jeśli myślisz o czymś takim, jak ASCII < -> . Z Windows-1252 lub ISO Latin jest to znacznie bardziej skomplikowane, ponieważ dane nie są tracone, ale często mylone. Dzieje się tak dlatego, że te kodowania mogą mieć dwa bajty i nie stanowią podzbioru UTF-8.

Jeśli nie wierzysz, możesz spróbować zrobić getBytes() z różnymi kodowaniami i zobaczysz uszkodzenie danych i utratę danych.

+0

nie powinienem pozwolić przeszkadza mi, ale to zawsze denerwuje mnie, kiedy ktoś głosów zamknąć z zewnątrz pisanie komentarz. –

Odpowiedz

0

Być może nie rozumiem natury niepoprawnie zakodowanych danych, ale ten kod PHP wydaje mi się przesadzony. Jeśli masz bajtów UTF-8, które zostały przekazane jako pojedynczych znaków, powinieneś być w stanie po prostu zrobić:

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

To nie działa, ponieważ dane są już uszkodzone. Gdybym miał oryginalne bajty, to by działało. Uwierz mi, że to, co wymieniłeś, jest czymś bardzo świadomym. –

+0

@AdamGent To właśnie robi kod PHP ... chociaż powinien używać Windows-1252 zamiast ISO-8859-1. Czy możesz pokazać przykład tego, co masz i co ma być? – Esailija

+0

Masz rację; zaktualizowany kod. Myślałem, że wszystkie bajty UTF-8 są również poprawnymi znakami ISO-8859-1, ale tak nie jest. – VGR

Powiązane problemy