Đây là bài đăng đầu tiên của tôi để ngăn xếp tràn. Tôi đã làm Java từ năm 1998, vì vậy tôi không phải là người mới bắt đầu. Gần đây tôi gặp phải một vấn đề mã hóa ký tự tệp mà tôi không thể nhớ bao giờ gặp phải. Nó khá phổ biến để phải nhận thức được mã hóa ký tự của các tập tin văn bản và viết mã xử lý mã hóa chính xác khi chạy trên các nền tảng khác nhau. Nhưng vấn đề tôi tìm thấy là do biên soạn trên một nền tảng khác từ nền tảng thực thi. Điều đó hoàn toàn bất ngờ, bởi vì trong kinh nghiệm của tôi khi javac tạo ra một tệp lớp, các tham số quan trọng là nguồn java và các tham số đích, và phiên bản của JDK thực hiện biên dịch. Trường hợp của tôi, các lớp được biên dịch với JDK 1.6.0_22 trên Mac OS X hoạt động khác với các lớp được biên dịch với 1.6.0_23-b05 trên Linux, khi chạy trên Mac OS X. Nguồn và đích được chỉ định là 1.4.Vấn đề mã hóa tệp nền tảng trình biên dịch Java
Một chuỗi được mã hóa dưới dạng ISO-8859_1 trong bộ nhớ đã được ghi vào đĩa bằng phương thức println PrintStream. Tùy thuộc vào nền tảng mà mã Java được biên dịch trên, chuỗi được viết khác nhau. Điều này dẫn đến một lỗi. Việc sửa lỗi là để chỉ định tệp mã hóa một cách rõ ràng khi viết và đọc tệp.
Điều làm tôi ngạc nhiên là hành vi này khác nhau tùy thuộc vào nơi các lớp được biên soạn, không phải trên nền tảng lớp học được chạy. Tôi khá quen thuộc với mã Java hoạt động khác nhau khi chạy trên các nền tảng khác nhau. Nhưng có một chút đáng sợ khi mã giống nhau, được biên dịch trên các nền tảng khác nhau, chạy khác nhau trên cùng một nền tảng.
Có ai gặp sự cố cụ thể này không? Dường như nó có thể bị bệnh cho bất kỳ mã Java nào đọc và ghi các chuỗi để gửi mà không chỉ định rõ ràng mã hóa ký tự. Và mức độ thường xuyên được thực hiện?
Cảm ơn,
Richard Brewster http://rabbitsoftware.com
là tệp có vấn đề được mã hóa là utf-8? Có các ký tự có vấn đề trong nguồn hay các ký tự chỉ không hợp lệ ** sau ** biên dịch chỉ trên máy cụ thể đó? –
Được biên dịch vào các lớp học bằng cách sử dụng cuối cùng tĩnh (biên dịch chung kết tĩnh "bakes" các chuỗi vào lớp)? hoặc khi bạn nói ghi vào đĩa là bạn serializing dữ liệu? tuần tự hóa một cá thể lớp? Phương pháp tuần tự hóa được biên dịch với mã hóa mặc định (ví dụ: biên dịch nền tảng)? –
@Steve B .: Trên thực tế, tất cả các chuỗi ký tự và các chuỗi hằng số biên dịch khác được "baken" vào lớp, không chỉ các chuỗi cuối cùng. –