Tôi đang cố gắng chuyển các tham số từ tầng trung gian PHP sang một chương trình phụ trợ java hiểu J2EE. Tôi đang viết mã điều khiển trong Groovy. Trong đó, tôi đang cố gắng giải mã một số tham số có thể chứa các ký tự quốc tế.giải mã utf-8 trong java
Tôi thực sự bối rối bởi kết quả của việc gỡ lỗi vấn đề này cho đến nay, vì vậy tôi muốn chia sẻ nó với bạn với hy vọng rằng ai đó sẽ có thể đưa ra cách giải thích chính xác kết quả của tôi.
Vì lợi ích của thử nghiệm nhỏ của tôi, thông số tôi chuyển là "déjeuner". Chỉ cần chắc chắn, System.out.println ("déjeuner") mang đến một cách chính xác tôi:
déjeuner
trong giao diện điều khiển
Bây giờ đây là các/dec và hex giá trị char của mỗi char của chuỗi gốc :
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
lưu ý rằng chuỗi c3a9 trong UTF-8 là nhân vật muốn-cho: http://www.fileformat.info/info/unicode/char/00e9/index.htm
Bây giờ nếu tôi cố gắng đọc chuỗi này như một chuỗi UTF-8, như trong stmt.ge tBytes ("UTF-8"), tôi đột nhiên kết thúc có một chuỗi 11 byte, như sau:
64 c3 83 c2 a9 6a 65 75 6e 65 72
trong khi stmt.getBytes ("iso-8859-1") mang lại cho tôi 9 byte:
64 c3 a9 6a 65 75 6e 65 72
lưu ý trình tự c3a9 tại đây!
bây giờ nếu tôi cố gắng để chuyển đổi chuỗi UTF-8 sang UTF-8, như trong
new String(stmt.getBytes("UTF-8"), "UTF-8");
tôi nhận được:
next char: d 100 64
next char: ? -61 c3
next char: ? -87 a9
next char: j 106 6a
next char: e 101 65
next char: u 117 75
next char: n 110 6e
next char: e 101 65
next char: r 114 72
lưu ý trình tự c3a9
khi
new String(stmt.getBytes("iso-8859-1"), "UTF-8")
kết quả bằng:
lưu ý e9 có trong utf-8 (và ascii), một lần nữa, ký tự 'é' mà tôi mong muốn.
Thật không may, trong cả hai trường hợp, tôi không kết thúc bằng chuỗi thích hợp sẽ hiển thị giống như chuỗi chữ "déjeuner". Kỳ lạ thay, các chuỗi byte cả hai dường như chính xác mặc dù.
Cảm ơn câu trả lời rất có nhiều thông tin. Vì vậy, nó nhấn xuống request.getParameter() trong javax.servlet.http.HttpServletRequest để không xử lý đúng các chuỗi byte được mã hóa UTF-8, đúng không? Tôi đã gọi req.setCharacterEncoding ("UTF-8") trên đó. Tôi có thể giải quyết vấn đề gì? Nó vẫn không rõ ràng cho tôi như thế nào tôi nhận được dữ liệu ban đầu cho các thông số của tôi (byte của nó, không ký tự) vì vậy tôi có thể nhận được một số _non-buggy_ String thực hiện để làm việc ra đúng chuỗi UTF ra khỏi nó ... – user162346
Đoán của tôi là người gửi mã hóa dữ liệu bằng UTF-8 nhưng không đặt đúng tiêu đề HTTP cho điều này. –
Vì vậy, hãy đảm bảo rằng phần PHP tạo ra các trang web chỉ định chính xác mã hóa của chúng, đặc biệt là trong biểu mẫu. –