Tôi có một ứng dụng Java nhận dữ liệu qua ổ cắm bằng cách sử dụng InputStreamReader
. Nó báo cáo "Cp1252" từ phương pháp getEncoding
của nó:Làm thế nào để bạn chỉ định một giá trị Java file.encoding phù hợp với trang mã Windows cơ bản?
/* java.net. */ Socket Sock = ...;
InputStreamReader is = new InputStreamReader(Sock.getInputStream());
System.out.println("Character encoding = " + is.getEncoding());
// Prints "Character encoding = Cp1252"
Điều đó không nhất thiết phải phù hợp với những gì các báo cáo hệ thống như trang mã của nó. Ví dụ:
C:\>chcp Active code page: 850
Ứng dụng có thể nhận byte 0x81, trong trang mã 850 đại diện cho ký tự ü
. Chương trình giải thích rằng byte với mã trang 1252, không xác định bất kỳ ký tự nào ở giá trị đó, vì vậy tôi nhận được một dấu chấm hỏi thay thế.
tôi đã có thể làm việc xung quanh vấn đề này cho một khách hàng sử dụng mã trang 850 bằng cách thêm một tùy chọn dòng lệnh trong tập tin batch để khởi động ứng dụng:
java.exe -Dfile.encoding=Cp850 ...
Nhưng không phải tất cả khách hàng của tôi sử dụng mã trang 850, tất nhiên. Làm thế nào tôi có thể sử dụng Java để sử dụng một trang mã tương thích với hệ thống Windows cơ bản? Sở thích của tôi sẽ là một cái gì đó tôi chỉ có thể đưa vào tập tin thực thi, để lại mã Java hoang sơ:
ENC=... java.exe -Dfile.encoding=%ENC% ...
+1. BTW Trên hệ thống Windows 7 của tôi, trang mã hoạt động là 850, nhưng Java báo cáo "Cp1252" là thuộc tính hệ thống "file.encoding". –
Các máy khách và máy chủ sẽ được cấu hình với cùng một mã hóa, bất kỳ điều gì có thể cho bất kỳ khách hàng nào. Một ứng dụng không phải Java gửi dữ liệu ký tự đến máy chủ bằng cách sử dụng trang mã cục bộ, máy chủ lưu trữ dữ liệu và sau đó máy chủ gửi nó đến ứng dụng Java. Không ai lưu trữ trang mã là gì, bởi vì miễn là mọi người đều sử dụng cùng một trang, điều đó không quan trọng. Vấn đề là ứng dụng Java không hợp tác; nó luôn sử dụng Cp1252. (Giải pháp "đúng" là thay đổi giao thức để buộc mọi thứ, ví dụ như UTF-8, nhưng thay đổi giao thức sẽ phá vỡ mọi cài đặt hiện có.) –
Sau đó, có vẻ như G_A có câu trả lời của bạn. Một tùy chọn khác là để có báo cáo ứng dụng không java cho ứng dụng java của bạn những gì nó nghĩ rằng mã hóa là, và sau đó sử dụng các nhà xây dựng thích hợp, như đã nêu ở trên. – Yishai