2015-03-07 16 views
5

Tôi cần đọc đầu vào từ người dùng và tôi muốn hỗ trợ các chữ cái không phải la tinh, chẳng hạn như Å, Ä và Ö.Đọc từ bàn phím trong UTF-8

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); 
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, "UTF-8"), true); 
out.println(keyboard.readLine()); 
out.println("Read with charset: " + Charset.defaultCharset().name()); 

Khi tôi chạy mã này và nhập chữ cái Latinh hoạt động như mong đợi (tôi nhập nội dung nào đó, nhấn enter và in ra những gì tôi đã nhập). Nhưng nếu tôi cố gắng với å tôi có được điều này:

å 

� 
Read with charset: UTF-8 

tôi phải nhấn Enter hai lần nếu văn bản kết thúc bằng một chữ cái không phải latin, và sau đó nó không hiển thị chúng ngay. Tôi đã thử điều này trong giao diện điều khiển của Netbeans, và trong dấu nhắc lệnh Windows và không cho kết quả mong đợi.


Tôi không thể tìm thấy giải pháp với UTF-8, nhưng thay vào đó là ISO-8859-1. Nó làm việc với giao diện điều khiển Netbeans của tôi (chắc chắn là UTF-8) và trong CMD khi lần đầu tiên chạy chcp 28591, thay đổi phông chữ (nó là cần thiết trong trường hợp của tôi) và chạy chương trình của tôi.

+0

http://stackoverflow.com/questions/4597749/read-write-txt-file-with-special-characters và http://stackoverflow.com/questions/9281629/read-special-characters-in-java -with-bufferedreader – crAlexander

+0

Nó làm việc cho tôi. Bàn điều khiển của bạn phải được thiết lập để không hiển thị đúng UTF-8. – RealSkeptic

+0

@RealSkeptic, tôi có thể in ra các ký tự không phải latin, không thành vấn đề (Sys.out.print ("å")). Điều này làm việc tốt trong cả hai giao diện điều khiển Netbeans và trong CMD. Nhưng khi tôi cố gắng đọc các ký tự, vấn đề xảy ra (cũng như phải nhấn enter hai lần khi một văn bản kết thúc bằng å ä hoặc ö). –

Trả lời

0

Bạn đã thử:

BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in,"UTF-8")); 

Nếu điều này không làm việc cố gắng đọc dòng byte thô sau đó chuyển đổi để new String(bytes,"UTF-8")

+0

Nếu bạn không chỉ định một bộ ký tự thì nó sẽ đi kèm với một bộ ký tự mặc định (đó là UTF-8 trong trường hợp của tôi, như bạn có thể thấy trong câu hỏi của tôi). Tôi đã thử đề xuất khác của bạn bằng cách đọc các byte nguyên nhưng không thành công. Tôi tìm thấy một cách giải quyết mặc dù (sử dụng ISO-8859-1 thay thế). –

+0

Không thể tin rằng nó sử dụng ISO-8859-1 không phải UTF-8. Tôi nghĩ UTF-8 là khá chuẩn ngày nay nhưng có lẽ không. –

1

Mẫu mã không mã hóa đúng trong bất kỳ cách nào. Nó đang đọc dữ liệu từ giao diện điều khiển bằng cách sử dụng mặc định hệ thống và sau đó ghi nó ra bằng cách sử dụng UTF-8. Mặc định hệ thống của bạn có thể không phải là UTF-8 và để làm phức tạp mọi thứ, bảng điều khiển của bạn có thể hoặc không giống như mặc định hệ thống của bạn.

Để thực hiện điều này một cách chính xác trong bảng điều khiển, bạn cần phải đọc bằng cách sử dụng mã hóa bảng điều khiển của mình và ghi ra bằng cách sử dụng mã hóa bảng điều khiển. Nếu bạn chỉ đang thử nghiệm điều này và cần phải viết ra một tập tin, ví dụ, viết nó như là UTF-8 và chắc chắn rằng bạn mở nó bằng một trình soạn thảo văn bản là UTF-8.

+0

Bàn điều khiển netbeans là UTF-8, trừ khi có lỗi với Netbeans. Tôi tìm thấy một công việc xung quanh mặc dù (kiểm tra câu hỏi cập nhật của tôi). –

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