2012-01-17 4 views
9

Tôi có ứng dụng khách đang gửi yêu cầu đến máy chủ. Máy chủ đang tìm nạp một trường từ cơ sở dữ liệu và gửi trả lời java.lang.String cho khách hàng. Máy chủ đang chạy trên JBoss phiên bản 5.0. Điều bất thường là, khi máy chủ đang chạy trên máy Windows, phản hồi nhận được của máy khách là bình thường nhưng khi nó đang chạy trên Linux, có một số vấn đề trong mã hóa.Một ký tự đặc biệt được nối trước §

Đây là các dữ liệu trong cơ sở dữ liệu: "INET§IMPNG\n"

đáp ứng được nhận một cách chính xác khi máy chủ đang chạy trên Windows.

Một ký tự đặc biệt được nối trước § khi máy chủ đang chạy trên Linux. Có điều đặc biệt nào tôi cần làm ở phía máy chủ không. Bất kỳ trợ giúp sẽ được đánh giá cao.

EDIT:

Câu trả lời nhận được là: INET§IMPNG.

+0

đăng nội dung được thêm vào? –

+0

Tôi đã chỉnh sửa câu hỏi .. – HashimR

Trả lời

9

Đây gần như chắc chắn là vấn đề mã hóa ký tự. Để tránh sự không khớp giữa máy khách và máy chủ, luôn luôn chỉ định một mã hóa cụ thể và tránh mã hóa mặc định. (Ví dụ: thay vì "xyz".getBytes(), hãy sử dụng "xyz".getBytes("UTF-8")

+0

Tôi có cần đặt loại nội dung phản hồi không? – HashimR

+0

@HashimR - Nó chắc chắn không thể làm tổn thương. Người nhận cũng nên được viết để kiểm tra loại nội dung cho một đặc điểm kỹ thuật ký tự và tôn trọng nó. (Nếu cả hai đầu đều dưới sự kiểm soát của bạn, bạn có thể cắt một số góc ở đây mà không gây hại rõ ràng. Nhưng tôi khuyên bạn nên chống lại điều đó bởi vì nó chỉ tạo ra một mảnh đất bị chôn vùi sẽ nổ tung trong tương lai khi một đầu được "nâng cấp".) –

+0

Vì vậy, những gì tôi nhận được từ bình luận ở trên của bạn là loại nội dung không nên được thiết lập vì nó sẽ ảnh hưởng đến khả năng mở rộng của chương trình. Chỉ sử dụng '" xyz ".getBytes (" UTF-8 ")' là đủ cho bây giờ. Tôi đã làm đúng chứ? :) – HashimR

2

Lỗi mà bạn thấy ở đây là do máy chủ Linux mặc định gửi chuỗi là UTF-8. Trong UTF-8, các ký tự ASCII thông thường được mã hóa thành một Ký tự § được mã hóa thành hai byte, nếu bạn giải mã bằng CP-1252, bạn sẽ thấy  § vì hai byte được hiểu là hai ký tự riêng biệt:

Máy chủ Windows sẽ sử dụng http://en.wikipedia.org/wiki/Windows-1252. § dưới dạng một byte đơn

Nếu bạn đang sử dụng giao thức của riêng mình, bạn nên chỉ định mã hóa ký tự nào để sử dụng trên dây. Tôi đề nghị bạn def ault to UTF-8 (chuẩn internet). Khi gửi chuỗi, bạn nên sử dụng "xyz".getBytes("UTF-8"). Nếu bạn nhận được chuỗi, bạn nên sử dụng new String(bytes, "UTF-8").

Nếu bạn đang sử dụng HTTP, ứng dụng khách của bạn nên tôn trọng tiêu đề trong phần 14 của thông số HTTP. Tôi đề nghị bạn sử dụng một máy khách HTTP được triển khai như Apache Commons HTTPClient hoặc một J2SE tích hợp sẵn. Ở phía máy chủ, bạn nên sử dụng phương thức response.getWriter() trong Servlet để có được một nhà văn sẽ tự động sử dụng mã hóa đã đồng ý. Xin lưu ý rằng bạn không thể chỉ tạo ra byte, vì máy chủ và máy khách có thể đã đồng ý với một mã hóa chuyển giao khác cho luồng HTTP!