01/10/2018, 17:13

Cách nhập tiếng Việt từ Console?

Chào mọi người, mình đang làm 1 Project Console nhưng cần nhập tiếng việt từ Console, mình đã thử cách sau :
package test_1;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;

public class Test_1 {

    public static void main(String[] args) throws UnsupportedEncodingException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in, "UTF8"));
        Scanner scan = new Scanner(in);
        System.out.println("Nhập chuỗi Tiếng Việt:  ");
        String ans = scan.nextLine();
        scan.close();
        System.out.println("Ket qua: " + ans);
    }

}

Mọi người cho mình hỏi là sai chỗ nào với ạ ? Thanks All

HelloWorld viết 19:21 ngày 01/10/2018

cho hỏi bạn dùng ide hay text editor gì vậy

明玉 viết 19:25 ngày 01/10/2018

Vote xài API mới: System.console, xài cái này thì ko cần lo lắng về encoding nữa.

BufferedReader in = new BufferedReader(System.console().reader());
```</s>
Nguồn tham khảo: https://stackoverflow.com/questions/8616915/java-console-charset-translation
Nếu không thì làm trên Windows thì phải dùng trực tiếp WinAPI (siêu khó).
Nguyễn Đình Anh viết 19:20 ngày 01/10/2018

Mình dùng Netbean bạn ạ :))

Nguyễn Đình Anh viết 19:25 ngày 01/10/2018

Nó bị lỗi này bạn ạ @@

Nguyen Kien viết 19:21 ngày 01/10/2018

Mình tự hỏi tại sao bạn sử dụng BufferedReader rồi lại sử dụng Scanner làm gì nữa ???
Đây là code mình sửa:

package chap01.basic;

import java.io.*;

public class Test {

	public static void main(String[] args) {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("Nhập chuỗi Tiếng Việt:  ");
		
		String ans = "";
		
		try {
			ans = in.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if(in != null) {
				try {
					in.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		System.out.println("Kết quả: " + ans);
	}
}

Nguyễn Đình Anh viết 19:20 ngày 01/10/2018

Đây là mình run trên Netbean, nó vẫn bị lỗi vậy @@ Thanks bạn

Nguyen Kien viết 19:20 ngày 01/10/2018

Thử lưu file dưới định dạng UTF-8 xem sao !

明玉 viết 19:28 ngày 01/10/2018

Người ta đọc từ console chứ không phải từ file, cũng không ghi ra file.
Cái này bug ngay từ lúc đọc rồi, chứ out.print xử lý tốt Unicode.

明玉 viết 19:21 ngày 01/10/2018

OK, sau một lúc nghiên cứu thì mình cũng biết thế nào rồi:

API System.console không xài được với redirected terminal (VD terminal được tích hợp của IDE), nó trả null, mà nó cũng không có cho tự chỉnh Unicode gì ráo (chỉ có auto detect encoding thôi), bên trên mình nhầm lẫn cho mình xin lỗi.
Ở trên các hệ điều hành họ Unix thì bạn cứ nhập xuất bình thường không cần chỉnh thêm, nó mặc định UTF8 cả.

Ở trên Windows thì khá phức tạp:

  • Input sẽ từ UTF-16LE (encoding của HĐH Windows) qua Input Encoder của terminal rồi mới qua được đến Input Decoder của Java (InputStreamReader, Scanner, v.v.). Input Encoding của CMD thì thường là Cp437; trong NetBeans (redirected terminal) thì vì một lý do nào đó, Input Encoding luôn là ISO-8859-1; trong Eclipse thì Input Encoding đi theo Project Setting, mặc định là UTF-8.
  • Output thì tương tự, đi từ UTF-16LE (encoding của class String trong Java) qua Output Encoder của Java, rồi mới qua Output Decoder của terminal. Output Encoding của CMD cũng thường là Cp437, trong NetBeans hoặc Eclipse thì đều theo project setting mặc định là UTF-8.

Tóm lại trên Windows thì thường là:

  • Input: UTF-16LE
明玉 viết 19:18 ngày 01/10/2018

@MeigyokuThmn

You kill a fly with a S400 rocket,

@D.A.N_3002 and all the others,

Anyone who started to learn “Java Head first” would never get an idea that Java is NOT only a language, but also a platform which is:

  • language: independent from its HOST Operating System
  • platform: dependent from its HOST Operating System

System.in and System.out are the generic IO to its host system. Hence they work with the HOST’s character set. Meaning: on Windows, for example, Cpxyz. Further, all IDEs shield their users from the HOST OS (or a bit impolite: fool them) with secret settings (and if the user is a bloody newbie and installed it wrongly he/she got the trouble like this boy D.A.N). What to do instead of buying an expensive S400 from Russia? Set the IN and OUT to the desired Character Set as following (as example for German):

Scanner s = new Scanner(System.in, "iso-8859-1");
// set to German international Character set 
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out),true,"iso-8859-1"));
// NOW everything will work fine...
System.out.print("Input:");
String X = s.nextLine();
System.out.println("Read:"+X);

Btw, wrapping System.in for Scanner is an overkill, too. Learn from this man…

The first post example can be simplified, I know that. But your example will not work for Vietnamese language. We need UTF-8 or UTF-16 to display Vietnamese language, but the console encoding is not set to that (setting encoding of Scanner or FileOutputStream to UTF-8 or UTF-16 will not work because the underlying encoding of terminal is intact). So one has to understand how all of this works.

明玉 viết 19:22 ngày 01/10/2018

My dear @MeigyokuThmn
Not so as you think. Vietnamese (UTF8 or UTF16) or German (UTF8 or iso-8859-1) has nothing to do with the settings for IN and OUT. It’s the character set you use. All the proposals were correct…but

only a half

because the OUT is not set so that System.out still works with the local HOST’s character set. Also, nothing to do with the System.in which is set to whatever UTF.


Alright, it’s NOT that I criticized you, but on the contrary: it’s good. I just want to lead you (and the others) to the true reason why the odd was arisen. Read System.setOut 3

I written that too in my post
That why I suggested @D.A.N_3002 to use another way specially for Windows:

https://illegalargumentexception.blogspot.com/2009/04/java-unicode-on-windows-command-line.html
https://illegalargumentexception.blogspot.com/2009/04/i18n-unicode-at-windows-command-prompt.html
Nguyễn Đình Anh viết 19:25 ngày 01/10/2018

Cảm ơn bạn mình nghĩ là nó phụ thuộc vào IDE mà mình đang dùng và lấy theo OS của mình

Nguyễn Đình Anh viết 19:29 ngày 01/10/2018

I think it depends on the IDE that I am using and taking my OS Thank you

明玉 viết 19:25 ngày 01/10/2018

Thật ra bạn nên hiểu cách nó hoạt động (post của mình đã ghi rõ), chứ đừng dựa dẫm quá vào IDE, nếu bạn chạy jar ngoài IDE thì sao?
Chỉ có UTF-8, UTF-16 và CP1258 (Tiếng Việt Unicode Tổ hợp) là support cho Tiếng Việt thôi (không tính đến các bảng mã “mượn” Iso-8859-1 như VNI, TCVN3, v.v.).

Bài liên quan
0