Mình dùng VS Code bản mới nhất, tải ở trang chủ (không nhớ phiên bản) và JDK 8u333.
Khi mình in ra thì nó lại bị lỗi như thế này, dùng nhiều cách nhưng vẫn không được. Mong mọi người giúp đỡ.
P/s: Lần đầu đăng bài, nếu có sai sót gì mong được giúp đỡ để sửa lại. :v
Lỗi chữ tiếng Việt khi in ra bị "?" ở những chữ cái có dấu tiếng Việt
coi có bật UTF-8 chưa á
File -> Preferences > Settings -> search encoding
Ko đc bạn ơi, mình đã làm như vậy với Eclipse và VS Code đây cũng ko đc.
Đổi font ở terminal thử xem, hình như dùng font Consolas gì đấy hiển thị được.
Cái này đến mấy ông MVP của Microsoft cũng khóc thét nên mình… cũng chịu thua.
Sau một hồi các kỹ sư Micro$oft loay hoay, họ trỏ đến bài viết trên trang Java.
Vẫn không được bạn ơi! Mặc dù đã chỉnh thành Tiếng Việt (cả hệ thống) rồi đó.
thử thêm dòng
System.out.println(Arrays.toString("ắ".getBytes()));
System.out.println("\u1EAF");
xem nó in ra cái gì
Nó bị lỗi về array gì đó :v
thêm 2 dòng import này
import java.util.*;
import java.lang.*;
nếu nó in ra
[-31, -70, -81]
nghĩa là java compiler nó đọc đúng utf-8 text
nếu ko phải thì xem dòng thứ 2 nếu in ra ắ
được nghĩa là nó in ra ký tự unicode được, nó chỉ ko đọc được utf8 text :V
Lúc biên dịch với javac
có tham số -encoding utf8
chưa?
đây nha :V
thêm flag -encoding utf8
vào javac
:V
đổi code page thành 65001 :V
và chạy trên cmd
chứ ko phải powershell nha :V
powershell:
cmd:
kì lạ là cái array kia nó in ra [63] nghĩa là “ắ” bị hiểu là “?” :V
chuyển sang code page 65001 ko phải là giải pháp triệt để mà chữa cháy thôi nha: https://stackoverflow.com/questions/31357126/c-sharp-and-java-console-encoding-and-powershell
What I can do is to use UTF-8 and call chcp 65001 beforehand. This works and then shows the right glyph, but has a bug where some characters are repeated
This is part of a set of long-standing bugs in Windows command line support for code page 65001. Generally code page 65001 is not a viable way to get C-stdlib applications to support Unicode on the console for this reason.
https://imgur.com/a/5VjGWSy
Hình như hồi trước nó vẫn chạy bình thường, có tiếng Việt đàng hoàng luôn. Nhưng từ khi mà cài cái biến môi trường của Java là nó vậy á :((
muốn chạy được trên powershell phải xài jna gọi hàm native của Windows WriteConsoleW
:V
In tiếng Việt ra console - Java
Cấu trúc project
D:\PROG\JAVA\TEST\001
│ README.md
│
├───lib
│ jna.jar
│
└───src
ChuongTrinhDauTien.java
Console.java
Download file jna.jar
ở đây và bỏ vào thư mục lib
Nguồn của Console.java
“chôm” ở đây, có sửa Native.loadLibrary
đã deprecated lại thành Native.load
và thêm package console.windows
package console.windows;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.StdCallLibrary;
/** For unicode output on windows platform
* @author Sandy_Yin
*
*/
public class Console {
private static Kernel32 INSTANCE = null;
public interface Kernel32 extends StdCallLibrary {
public Pointer GetStdHandle(int nStdHandle);
public boolean WriteConsoleW(Pointer hConsoleOutput, char[] lpBuffer,
int nNumberOfCharsToWrite,
IntByReference lpNumberOfCharsWritten, Pointer lpReserved);
}
static {
String os = System.getProperty("os.name").toLowerCase();
if (os.startsWith("win")) {
INSTANCE = (Kernel32) Native.load("kernel32", Kernel32.class);
}
}
public static void println(String message) {
boolean successful = false;
if (INSTANCE != null) {
Pointer handle = INSTANCE.GetStdHandle(-11);
char[] buffer = message.toCharArray();
IntByReference lpNumberOfCharsWritten = new IntByReference();
successful = INSTANCE.WriteConsoleW(handle, buffer, buffer.length, lpNumberOfCharsWritten, null);
if (successful) System.out.println();
}
if (!successful) System.out.println(message);
}
}
Nguồn ChuongTrinhDauTien.java
(thêm package main
):
package main;
import java.util.*;
import java.lang.*;
import java.nio.charset.*;
import console.windows.*;
public class ChuongTrinhDauTien {
public static void main(String[] args) {
System.out.println("Chào bạn và mọi người.");
System.out.println(Arrays.toString("ắ".getBytes()));
System.out.println("\u1EAF");
Console.println("Chào bạn và mọi người.");
}
}
Build và run
Compile
Mở Powershell tới thư mục project (ở đây là D:\PROG\JAVA\TEST\001
), gõ:
javac -encoding utf8 -classpath "lib\*" -d "build" "src\*.java"
javac
sẽ compile ra các class:
D:\PROG\JAVA\TEST\001\BUILD
├───console
│ └───windows
│ Console$Kernel32.class
│ Console.class
│
└───main
ChuongTrinhDauTien.class
Build jar file
cd build; jar cvf "001.jar" *
jar
sẽ gom các class lại thành 1 file jar, ở đây đặt tên là 001.jar
D:\PROG\JAVA\TEST\001\BUILD
│ 001.jar
│
├───console
│ └───windows
│ Console$Kernel32.class
│ Console.class
│
└───main
ChuongTrinhDauTien.class
Run
Nếu ở trong thư mục build
(D:\PROG\JAVA\TEST\001\BUILD
) thì gõ:
java -cp "001.jar;..\lib\*" main.ChuongTrinhDauTien
Nếu ở trong thư mục project (D:\PROG\JAVA\TEST\001
) thì gõ:
java -cp "build\001.jar;lib\*" main.ChuongTrinhDauTien
Nó sẽ in ra:
Chào b?n và m?i ng??i.
[63]
?
Chào bạn và mọi người.
Chạy trên Powershell hay Cmd, bất kể code page nào thì dòng cuối cùng cũng in ra chữ tiếng Việt được
https://imgur.com/a/zcmkgqE
Được rồi này, ủa mà sau này muốn in ra thì phải dùng đến cái này đúng ko? Cái terminal của VS Code coi như vứt đi luôn hả? :vvv
Bạn muốn dùng code editor với vai trò của IDE thì tại sao không dùng IDE? Mình chẳng hiểu sao dùng code editor như VSCode mà cứ thích biến nó thành IDE làm gì. Cứ dùng truyền thống và mở Terminal hoặc Console lên chạy thôi, bao nhiêu năm vẫn thế.
là vẫn dùng cái lệnh như trên kia nhỉ?
chỉ xài khi cần in tiếng Việt thôi :V :V
mà ko biết mix cái này với System.out.println
bình thường được ko ta :V Nếu ko được thì cứ gõ Console.println(<convert to strings>)
hết khi cần output tiếng Việt :V
sửa lại Console.WriteLine cho giống C#