thử thêm dòng
System.out.println(Arrays.toString("ắ".getBytes()));
System.out.println("\u1EAF");
xem nó in ra cái gì
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
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.");
}
}
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
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
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#
Cảm ơn bạn nhiều, nếu mà in đc Tiếng Việt trực tiếp trên VS Code thì tốt, nhưng mà được vậy là ổn rồi.
Chứ nếu test code liên tục mà cứ copy paste mấy cái lệnh thì hơi mệt xíu
muốn code trên vscode thì install thêm cái plugin Maven for Java gì đấy rồi tạo project bằng Maven mà chạy :V
https://maven.apache.org/download.cgi tải “Binary zip archive” rồi giải nén ra, để ở đâu đó ví dụ D:\Maven
. Giải nén xong cho D:\Maven\bin
vào PATH
để chạy lệnh mvn
trên terminal được.
làm theo tutorial của Maven chạy lỗi tùm lum :V mình thấy lệnh này chạy được:
mvn archetype:generate -DgroupId=main -DartifactId=002 -DinteractiveMode=false
nó sẽ tạo project mới có tên là 002
, có cấu trúc:
D:\PROG\JAVA\TEST\002
│ pom.xml
│
└───src
├───main
│ └───java
│ └───main
│ App.java
│
└───test
└───java
└───main
AppTest.java
nó tạo sẵn cái App.java
rồi thì khỏi xài ChuongTrinhDauTien.java
nữa vậy :V
cái AppTest kia nó tạo sẵn thì tốt, hiện giờ chưa xài thì kệ nó :V :V
vô thư mục 002
, tạo thư mục .vscode
rồi tạo file 002.code-workspace
trong đó:
D:\PROG\JAVA\TEST\002
│ pom.xml
│
├───.vscode
│ 002.code-workspace
│
...
nội dung của 002.code-workspace
là
{
"folders": [
{
"path": ".."
}
]
}
rồi double click mở file này lên bằng VS Code, chọn “Always open with this app” luôn, lần sau mở project chỉ cần double click vô file .code-workspace
này là được
mở file pom.xml
, thêm jna dependency này vào:
<dependencies>
...
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.11.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
thêm encoding utf8 cho project:
<project ...>
...
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
nếu xài Java “cũ” 1.7 thì ko cần thêm cái compile source/target kia, ở đây mình lỡ install Java 17 nên phải có thêm 2 dòng này :V :V Tại vì compile bằng lệnh mvn compile
mặc định nó pass -source 1.5
và -target 1.5
vào javac
, mà Java 17 nó ko chịu 1.5 :V tối thiểu phải là 1.7 gì đấy, kệ quất 17 luôn =] Nếu viết project cho người khác compile thì nên để 1.7 được rồi :V
nội dung đầy đủ của file pom.xml
:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>main</groupId>
<artifactId>002</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>002</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.11.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
sửa xong file pom.xml
này thì mở PowerShell lên lại, cd tới thư mục root của project (D:\PROG\JAVA\TEST\002
) rồi chạy lệnh
mvn clean install
để nó update những thay đổi trong file pom.xml
Console.java
thêm file console\windows\Console.java
trong thư mục src\main\java
, phải tạo thêm folder console\windows
cho đúng cái tên package console.windows
:V
D:\PROG\JAVA\TEST\002
│ pom.xml
│
├───.vscode
│ 002.code-workspace
│
└───src
├───main
│ └───java
│ ├───console
│ │ └───windows
│ │ Console.java
│ │
│ └───main
│ App.java
│
└───test
└───java
└───main
AppTest.java
nội dung Console.java
(vẫn như cũ, chỉ có sửa tên hàm println
lại thành WriteLine
:V :V
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 WriteLine(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);
}
}
nội dung file App.java
:
package main;
import console.windows.*;
public class App {
public static void main(String[] args) {
Console.WriteLine("Xin chào các bạn!");
Console.WriteLine("Xin chào mọi người!");
}
}
bấm F5 là debug ngon lành ko cần thêm gì cả :V
hay click vô Run | Debug gì ở ngay hàm main cũng được :V
help, nó lại bị lỗi tiếp này :vv
https://imgur.com/a/t1DAn0d
Nó còn nói hai cái file đó non-project gì nữa đó :v
Mong bạn giúp
à quên sửa file pom.xml
xong thì phải ra ngoài gõ mvn clean install
lại nữa :V
cd tới thư mục của project (D:\PROG\JAVA\TEST\002
), gõ mvn clean install
là được :V để thêm vô cái hướng dẫn kia :V :V
nó bị lỗi Console cannot be resolved gì đó á bạn (lỗi tiếp)
vô daynhauhoc’s discord đi sửa lỗi lẹ hơn :V rồi post solution vô đây, ở đây cứ 1 ngày sửa 1 lỗi lâu quá :V
update có hình :V
mở powershell, gõ lệnh
mvn archetype:generate -DgroupId=main -DartifactId=004 -DinteractiveMode=false
ở đây 004
là tên project
tiếp theo tạo code-workspace:
cd 004
md .vscode
New-Item .vscode\004.code-workspace -ItemType File -Value '{"folders":[{"path": ".."}]}'
code .vscode\004.code-workspace
mở vscode lên rồi thì tắt powershell ở ngoài đi, xài powershell ở trong vscode :V
mở file App.java
lên, xem có thấy dòng Run|Debug
kia ko
thấy Run|Debug
rồi thì bấm vào Run chạy cho nó in ra Hello World
chạy được rồi thì mở file pom.xml
lên để thêm encoding, jna dependency vào :V
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>main</groupId>
<artifactId>004</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>004</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.11.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
save lại thì sẽ thấy vscode nó hiện lên thông báo có muốn sync config mới ko, bấm Now hoặc Always là nó tự động config lại cho mình, khỏi cần gõ mvn clean install
17
thay vì 1.7
:Vqua tab Terminal của vscode, tạo file Console.java
:
md src/main/java/console/windows
New-Item src/main/java/console/windows/Console.java -ItemType File
copy nội dung file Console.java
và App.java
ở trên vào rồi chạy là được