Safe Encoding Constructors
Bắt Java để thông báo đúng cho bạn về những lỗi mã hóa là khéo léo.Bạn phải sử dụng verbose nhất và, than ôi, các sử dụng ít nhất trong bốn contructors thay thế cho mỗi InputStreamReader
và OutputStreamWriter
nhận một ngoại lệ thích hợp trên một trục trặc mã hóa.
Đối với tập tin I/O, luôn luôn đảm bảo luôn luôn sử dụng như là đối số thứ hai để cả OutputStreamWriter
và InputStreamReader
đối số encoder ưa thích:
Charset.forName("UTF-8").newEncoder()
Có khả năng thậm chí fancier khác, nhưng không ai trong số ba đơn giản hơn khả năng làm việc cho bàn giao ngoại lệ. Những làm:
OutputStreamWriter char_output = new OutputStreamWriter(
new FileOutputStream("some_output.utf8"),
Charset.forName("UTF-8").newEncoder()
);
InputStreamReader char_input = new InputStreamReader(
new FileInputStream("some_input.utf8"),
Charset.forName("UTF-8").newDecoder()
);
Đối với chạy với
$ java -Dfile.encoding=utf8 SomeTrulyRemarkablyLongcLassNameGoeShere
Vấn đề là rằng sẽ không sử dụng hình thức lập luận encoder đầy đủ cho các nhân vật suối, và do đó bạn sẽ một lần nữa bỏ lỡ vấn đề mã hóa.
dài Ví dụ
Dưới đây là một ví dụ nữa, chương trình này quản lý một quá trình thay vì một tập tin, nơi mà chúng tôi thúc đẩy hai đầu vào khác nhau byte suối và một đầu ra byte stream tất cả để tự UTF-8 suối với xử lý ngoại lệ đầy đủ:
// this runs a perl script with UTF-8 STD{IN,OUT,ERR} streams
Process
slave_process = Runtime.getRuntime().exec("perl -CS script args");
// fetch his stdin byte stream...
OutputStream
__bytes_into_his_stdin = slave_process.getOutputStream();
// and make a character stream with exceptions on encoding errors
OutputStreamWriter
chars_into_his_stdin = new OutputStreamWriter(
__bytes_into_his_stdin,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newEncoder()
);
// fetch his stdout byte stream...
InputStream
__bytes_from_his_stdout = slave_process.getInputStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stdout = new InputStreamReader(
__bytes_from_his_stdout,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
// fetch his stderr byte stream...
InputStream
__bytes_from_his_stderr = slave_process.getErrorStream();
// and make a character stream with exceptions on encoding errors
InputStreamReader
chars_from_his_stderr = new InputStreamReader(
__bytes_from_his_stderr,
/* DO NOT OMIT! */ Charset.forName("UTF-8").newDecoder()
);
Bây giờ bạn có ba nhân vật suối rằng tất cả tăng ngoại lệ về lỗi mã hóa, tương ứng gọi là chars_into_his_stdin
, chars_from_his_stdout
và chars_from_his_stderr
.
Điều này chỉ phức tạp hơn một chút so với những gì bạn cần cho vấn đề của mình, giải pháp mà tôi đã đưa ra trong nửa đầu của câu trả lời này. Điểm mấu chốt là đây là cách duy nhất để phát hiện lỗi mã hóa.
Chỉ cần không làm cho tôi bắt đầu về trường hợp ngoại lệ ăn uống PrintStream
.
Đó không phải là đủ . Bạn cũng cần một 'InputStreamReader (InputStream in, CharsetDecoder dec))', chẳng hạn đối số cuối cùng là 'Charset.forName (" UTF-8 "). NewDecoder()'. – tchrist
Lỗi mã hóa đầu vào sẽ tự động bị xóa nếu bạn thực hiện điều đó. – tchrist
Không cần bộ mã hóa. Hàm khởi tạo chấp nhận một String, một Charset hoặc một Encoder trong cả hai lớp Input/Output. Không chắc chắn ý bạn là gì. Bạn có thể xây dựng được không? –