2012-07-07 35 views
5

Như tiêu đề nói ... tôi đọc nội dung từ phản ứng httoLàm thế nào để chuyển đổi chuỗi được mã hóa trong windows-1250/Cp1250 thành utf-8?



    InputStream is = response.getEntity().getContent(); 
    String cw = IOUtils.toString(is); 
    byte[] b = cw.getBytes("Cp1250"); 
    String x = StringUtils.newStringUtf8(b); 
    String content = new String(b, "UTF-8"); 

    System.out.println(content); 

Tôi đã cố gắng rất nhiều biến thể. Tôi ít bối rối về những hằng số mã hóa chính xác được sử dụng như chuỗi. windows-1250 hoặc Cp1250. UTF-8 hoặc utf-8 hoặc utf8?

Trả lời

6

Bạn có vẻ nghĩ rằng đối tượng String có mã hóa. Điều đó không đúng. Mã hóa được sử dụng như một phần của bản dịch từ dữ liệu nhị phân (byte[] hoặc InputStream) cho dữ liệu văn bản (String hoặc char[] v.v.).

Nó không rõ ràng những gì IOUtils.toString đang làm, nhưng nó gần như chắc chắn mất dữ liệu hoặc ít nhất là xử lý nó một cách không thích hợp. Nếu dữ liệu của bạn ban đầu trong Windows-1250, thì bạn nên sử dụng InputStreamReader gói InputStream, chỉ định bộ ký tự trong cuộc gọi hàm tạo InputStreamReader.

Không rõ nơi UTF-8 xuất hiện - bạn có thể muốn ghi dữ liệu trong UTF-8 sau đó, nhưng kết quả sẽ là byte[] chứ không phải chuỗi.

+2

Về mặt kỹ thuật, 'java.lang.Chuỗi' có Mã hóa: UTF-16. –

4

Bạn đang chuyển đổi ngược. Bạn cần lấy dữ liệu đầu vào dưới dạng mảng byte và sau đó sử dụng String(byteArray, "Cp1250") để tạo đối tượng Chuỗi. Sau đó, nếu bạn muốn UTF-8, hãy sử dụng String.getBytes("UTF-8").

0

Giả sử Apache Commons IO, sử dụng one of the methods that specifies an encoding:

String cw = IOUtils.toString(is, "windows-1250"); 

Tất cả các chuỗi đang ngầm UTF-16 trong Java. Các mã hóa khác thường được biểu diễn bằng các mảng byte.

3

Mã hóa có tên kinh điển (duy nhất) và các tên khác nhau khác nhau và phân biệt chữ hoa chữ thường. Ví dụ "UTF-8" là tên chính tắc, nhưng một số phiên bản java lại là "UTF8"; nó đã được viết nhiều hơn để sử dụng phổ biến. Tương tự cho "Windows-1250", mà bạn cũng có thể thấy trong các trang HTML. "Cp1250" (Mã-Trang) là tên nội bộ java.

Trong byte java [] là dữ liệu nhị phân, Chuỗi (nội bộ Unicode) là văn bản. Chuyển đổi giữa cả hai đều cần mã hóa, thường là tùy chọn, mặc dù sử dụng hệ điều hành mặc định.

byte, InputStream, OutputStream < -> String, char, Reader, Writer

String cw = IOUtils.toString(is, "UTF-8"); // InputStream is binary gives byte[], hence give encoding 
byte[] b = cw.getBytes("Cp1250"); 
String x = new String(b, "Cp1250"); 
String content = s; 

System.out.println(content); 

Để cho phép (mã hóa qua) String phổ quát này, String nội bộ sử dụng char, UTF-16. Hằng số chuỗi được lưu trữ trong tệp .class dưới dạng UTF-8 (gọn hơn).

-1

Tôi thấy tốt hơn khi sử dụng Máy quét để đọc trong các bộ ký tự khác nhau.

FileInputStream is = new FileInputStream(fileOrPath); 
    Scanner scanner = new Scanner(is, "cp1250"); 
    String out = scanner.next(); 

Và phương pháp next() trả về String giá trị trong bộ ký tự của ứng dụng.

Đã thử nghiệm trên "ngôn ngữ Séc" từ "cp1250" đến "UTF-8".

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