2012-12-14 34 views
5

Tôi đang xử lý dịch vụ web bên ngoài đang cung cấp cho tôi chuỗi (hoặc bị hỏng) mã hóa không chính xác (UTF-8) có khả năng nhất là ISO LATIN hoặc WINDOWS-1252 nhưng bây giờ là UTF-8 (và hoặc hỗn hợp ISO/WINDOWS/UTF-8). Một chiếc mũ đáng yêu (Â) rất nhiều.Thư viện Java để sửa văn bản được mã hóa không chính xác bằng cách sử dụng chẩn đoán

Tôi rõ ràng không thể sửa cách dịch vụ web bên ngoài lưu trữ các chuỗi của nó để thông tin bị mất. Vì vậy, hy vọng một bản dịch 100% mà tôi biết là không thể.

Nhưng tôi đã hy vọng rằng ai đó đã viết một thư viện lập bản đồ heuristic ký tự trong Java (một số của nó không chắc sẽ gõ một mũ).

Nếu không tôi nghĩ tôi có thể cổng này kẻ mã PHP: https://stackoverflow.com/a/3521340/318174

UPDATE và Giải thích: Chuyển đổi đơn giản như @VGR đã trả lời với sẽ không hoạt động. Tôi không có byte gốc. Dữ liệu đã được chuyển đổi không chính xác tại điểm cuối (máy chủ SOAP có thể getBytes(/*with out correct encoding*/) đã được thực hiện hoặc có thể dữ liệu được lưu trữ ở định dạng không chính xác). Khi bạn chuyển đổi byte thành chuỗi trong Java, dữ liệu sẽ không được giữ lại trừ khi mã hóa giống nhau ở mọi nơi. Điều này rất dễ hiểu nếu bạn nghĩ về một cái gì đó như ASCII < ->UTF-8. Với Windows-1252 hoặc ISO Latin phức tạp hơn nhiều vì dữ liệu không bị mất nhưng thường bị nhầm lẫn. Đó là bởi vì các mã hóa đó có thể là hai byte và không phải là một tập con của UTF-8.

Nếu bạn không tin tôi, bạn có thể thử làm getBytes() quay lại với các mã hóa khác nhau và sẽ thấy dữ liệu bị hỏng và mất dữ liệu.

+0

Tôi không nên làm phiền tôi nhưng nó luôn làm phiền tôi khi một số người bỏ phiếu để đóng bằng cách viết bình luận. –

Trả lời

0

Tôi có thể hiểu sai bản chất của dữ liệu được mã hóa không chính xác, nhưng mã PHP có vẻ như quá mức đối với tôi. Nếu bạn có các byte UTF-8 được chuyển thành các ký tự riêng lẻ, bạn có thể chỉ cần thực hiện:

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

Điều đó không hoạt động vì dữ liệu đã bị hỏng. Nếu tôi có các byte gốc thì nó sẽ hoạt động. Hãy tin tôi những gì bạn đã liệt kê là điều tôi rất ý thức. –

+0

@AdamGent Đây là những gì mã PHP làm ... mặc dù nó nên sử dụng Windows-1252 thay vì ISO-8859-1. Bạn có thể hiển thị ví dụ về những gì bạn có và những gì nó được cho là? – Esailija

+0

Bạn nói đúng; mã được cập nhật. Tôi đã nghĩ rằng tất cả các byte UTF-8 cũng là các ký tự ISO-8859-1 hợp lệ, nhưng đó không phải là trường hợp. – VGR

Các vấn đề liên quan