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

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

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.

https://imgur.com/a/f5aaW1E
vẫn không được luôn bạn :frowning:

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.

3 Likes

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ì

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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?