Lỗi chữ tiếng Việt khi in ra bị "?" ở những chữ cái có dấu tiếng Việt

thử thêm dòng

System.out.println(Arrays.toString("ắ".getBytes())); 	
System.out.println("\u1EAF");

xem nó in ra cái gì

4 Likes

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

3 Likes

Lúc biên dịch với javac có tham số -encoding utf8 chưa?

1 Like

vẫn không được luôn :(((((
https://imgur.com/a/tmfqcyk

Làm sao để chỉnh đây?
https://imgur.com/a/yDYkjZG

đâ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:
image


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.

5 Likes

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

5 Likes

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ế.

2 Likes

là vẫn dùng cái lệnh như trên kia nhỉ? :smiley:

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# :crazy_face:

4 Likes

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 :laughing:

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
image


Install Apache Maven

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.

Tạo project bằng Maven

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

Tạo VS Code workspace

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

{
	"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

Thêm encoding, dependency cho project

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-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

Thêm file 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);
    }
}

Run | Debug

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
image

4 Likes

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 :smiley:

1 Like

à 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

3 Likes

nó bị lỗi Console cannot be resolved gì đó á bạn :frowning: (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

4 Likes

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


nếu ko thì install 3 cái extensions này:
image

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


nếu thấy có dòng

thì sửa lại compiler source và target cho đúng version của Java compiler, ở đây là 17 thay vì 1.7 :V
image

qua 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.javaApp.java ở trên vào rồi chạy là được

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?