2011-12-23 43 views
5

Giao diện điều khiển đầu vào (giành chiến thắng), cách hoạt động của bộ ký tự tập hợp là gì?bảng điều khiển java charset dịch

Mã dưới đây, không phải ascii chars đầu ra rác - InputStreamReader trong ví dụ dưới đây không lấy bộ ký tự làm đối số.

BufferedReader console = new BufferedReader(new InputStreamReader(System.in)); 
String inp = console.readLine(); 
System.out.println(inp.toUpperCase()); 

Là độc lập không phụ thuộc, Java giải quyết tất cả các cấu hình bộ ký tự có thể khác nhau liên quan đến điều khiển đầu vào nhanh như thế nào?

Trả lời

12

Trên thực tế, Java không xử lý vấn đề này ở tất cả các.

Đơn giản giả định rằng mã hóa bảng điều khiển giống với mã hóa mặc định của hệ thống. This assumption is wrong on Windows systems, do đó Java không cung cấp giải pháp tốt để thực hiện đúng giao diện điều khiển IO đối với các ký tự không phải ascii trên Windows.

giải pháp có thể là:

  • Sử dụng System.console() giới thiệu trong Java 6:

    BufferedReader in = new BufferedReader(System.console().reader()); 
    BufferedWriter out = new PrintWriter(System.console().writer(), true); 
    
    out.println(in.readLine().toUpperCase()); 
    

    Lưu ý rằng System.console() có thể trở lại null khi bạn chạy chương trình với chuyển hướng IO, ví dụ, trong IDE. Bạn cần một dự phòng cho trường hợp này.

  • Xác định giao diện điều khiển mã hóa một cách rõ ràng:

    String consoleEncoding = "..."; 
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in, consoleEncoding)); 
    BufferedWriter out = new PrintWriter(new OutputStreamWriter(System.in, consoleEncoding), true); 
    
    out.println(in.readLine().toUpperCase()); 
    

    Theo như tôi biết, không có những cách tốt để xác định mã hóa giao diện điều khiển thực tế lập trình mà không cần mã gốc.

  • Xác định giao diện điều khiển mã hóa như mã hóa mặc định sử dụng file.encoding tài sản, do đó giả định rằng giao diện điều khiển IO sử dụng mã hóa mặc định sẽ là đúng:

    java -Dfile.encoding=... ... 
    
5

1) Thực tế mà nói: làm thế nào để nhân vật Mã hoá nơi làm việc, và làm thế nào bạn nên đối phó với họ:

Bất kỳ dòng nhân vật được đọc trong được mã hóa/giải mã. Java bao gồm các chi tiết mã hóa/giải mã như một phần của JDK: http://docs.oracle.com/javase/1.6/docs/guide/intl/encoding.doc.html. Ví dụ: UTF-8 issue in Java code.

2) Câu hỏi cụ thể của bạn: Ngôn ngữ JAVA đa nền tảng xử lý đầu vào bảng điều khiển có hệ điều hành cụ thể như thế nào?

Câu trả lời ngắn gọn: Mặc dù mã byte Java là nền tảng trung lập, JVM KHÔNG. Đó là, chức năng "System" "in/out/err" của java không được thực hiện đầy đủ trong java cũ thông thường!

Khi bạn RUN java, lớp "Hệ thống", tóm tắt khái niệm cơ bản của hệ thống mà JVM đang chạy, được tải. Trong thời gian này, đó là các luồng đầu vào/đầu ra/lỗi (tức là các đối tượng bạn đang truy cập khi bạn gõ System.in, System.out, System.err được thiết lập tại RUNTIME bởi ClassLoader chịu trách nhiệm, ... lớp tải java.

trong trường hợp của "hệ thống", ClassLoading là một nhiệm vụ phức tạp, như bạn có nghĩa, bởi vì lập Hệ thống lớp (giống như thiết lập java Runtime lớp) là một mức độ thấp hơn Vấn đề triển khai JVM là hệ điều hành cụ thể

Một lần nữa, chỉ cần rõ ràng: Mặc dù LANGUAGE Java là nền tảng độc lập, JVM cho nền tảng của bạn, do đó, không giống như ngôn ngữ lập trình Java, Môi trường hệ điều hành cụ thể tạo tài nguyên mà chúng tôi tham chiếu trong mã của chúng tôi cho chúng tôi khi chạy.

Để hiểu rõ hơn: Thanh toán mã nguồn thực sự cho lớp Hệ thống, nó rất dễ đọc và sẽ giúp bạn hiểu rõ hơn những gì đang diễn ra. Đặc biệt, nhìn vào phương pháp nullInputStream():

http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Core/lang/java/lang/System.java.htm

Các vấn đề liên quan