Chạy file jar với utf-8 bằng exec php?

Mình chạy dùng php exec chạy file jar với input “Xin chào bận rồi 越南” đã dùng utf-8_encode()
nhưng java lại nhận sai args thành: “Xin chà o bận rá»?i è¶?å�?” (chuỗi sai)
Decode cũng sai thành: “Xin chào bận r�?i �?�??”
Mình thử echo chuỗi đã encode trong cmd (php) rồi copy ra, thì đúng là “Xin chà o bận rồi 越南” (chuỗi đúng)
Lỗi này giống với chạy trực tiếp command trên cmd mà system locale có utf-8.
Ai biết sửa lỗi giúp mình với ạ? Cảm ơn nhiều

Code php:

?php
$title=utf8_encode("Xin chào bận rồi 越南");
//echo $title; exit;
exec('java -Dfile.encoding=UTF-8 -jar C:\Users\sony\Downloads\upload.jar "'.$title.'"');

Code java:

public static void main(String[] args) throws IOException, InterruptedException {
		JOptionPane.showMessageDialog(null,args[0]);
		copy_to_clipboard(args[0]);
//Decode
JOptionPane.showMessageDialog(null,new String(args[0].getBytes("ISO-8859-1"),"UTF-8"));
}

Tại sao bạn lại dùng getBytes là 1 encoding khác. Truyền vào utf8. Encode lại bằng ISO-8879-1 rồi lại decode bằng utf8. Bạn có thấy vấn đề không

5 Likes

cái decode mình cũng ko biết nữa, chắc sai rồi nhưng cái args[0] mình paste thẳng vào web decode online thì cũng sai rồi ạ!

Bạn code luôn 1 cái java server rồi muốn giao tiếp kiểu gì cũng đc. Gọi lệnh cmd như này nhiều khi còn do hệ điều hành.

4 Likes

Bạn copy paste thế thì lại bị HĐH quản lý nữa rồi

3 Likes

Cái trang mà bạn dùng là nó mã hóa dạng \xHH. Bởi vậy chuỗi nhập phải là dạng \xHH thì nó mới giải mã đúng.

Mã hóa theo trang: https://cafewebmaster.com/online_tools/utf_decode

Xin chào bận rồi 越南

Xin chà o bận rồi 越南

Biết gì không? Có vài kí tự không nhận dạng được sẽ bị đổi thành: 2 kí tự ?.

Xin chà o bận rồi 越南
Xin chà o bận r�i ��
                  ^    ^ ^^

Dẫn đến java nhận chuỗi này sai.
Mình chưa rõ do hàm exec() của php hay của máy ảo java gây ra.

Thử dùng CMD đánh trực tiếp thay vì dùng hàm exec() nếu kết quả đúng -> do hàm exec(). Nếu sai do Java, đến đây lại xét đến -Dfile.encoding=UTF-8.

Ờ, tạm thế. :smiling_imp:

2 Likes

Viết 1 hàm encode và decode dạng base64 đi bạn , có lẽ nhanh hơn đó :innocent::innocent::innocent::innocent::innocent:
Ví dụ 1 chuỗi với đầy đủ độ khó, chú ý chuỗi này có khoảng trắng ở đầu và cuối chuỗi chứ không đơn giản:

 Hà Mã Tím đáng yêu không biết bơi nhưng thích ở dưới nước 

chuyển sang base64:

IEjDoCBNw6MgVMOtbSDEkcOhbmcgecOqdSBraMO0bmcgYmnhur90IGLGoWkgbmjGsG5nIHRow61jaCDhu58gZMaw4bubaSBuxrDhu5tjIA==

có thể dễ dàng decode lấy lại chuỗi gốc

4 Likes

Cảm ơn bạn, mình đã chuyển qua base64

1 Like

Cảm ơn các bạn đã comment

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