Trong quá trình làm việc với AJAX và các URL, xử lý chuỗi tiếng Việt là một thách thức không nhỏ. Dưới đây là cách tiếp cận để giải quyết vấn đề này.
Giải pháp sử dụng XML:
Lý thuyết: HTML không hỗ trợ thiết lập mã hóa, nhưng XML thì có thể. Sử dụng XML để truyền tải dữ liệu sẽ giúp khắc phục vấn đề này.
<script>
function guiDuLieu(){
var duLieu = document.getElementById("nhapDuLieu").value;
// Giả sử duLieu là thông tin cần gửi
alert(duLieu);
var xmlTaiLieu = new ActiveXObject("MSXML2.DOMDocument");
xmlTaiLieu.loadXML("<thongTin></thongTin>");
xmlTaiLieu.documentElement.text = duLieu;
alert(xmlTaiLieu.xml); // Kiểm tra nội dung XML tạo ra
var httpNhan = new ActiveXObject("MSXML2.XMLHttp.5.0");
var diaChi = "xuLyDuLieu?gio=" + (new Date()).getTime();
httpNhan.open("POST", diaChi, false);
httpNhan.send(xmlTaiLieu);
alert(httpNhan.responseText);
}
</script>
Xử lý tại server (ví dụ Java):
// Đọc dữ liệu từ request
SAXReader docDoc = new SAXReader();
Document taiLieu = null;
try {
taiLieu = docDoc.read(request.getInputStream());
} catch (Exception loi) {
System.err.println("Không đọc được XML. Có thể không có dữ liệu.");
loi.printStackTrace();
}
System.out.println("Nhận được XML: " + taiLieu.asXML());
// Giải mã XML
String ketQua = taiLieu.getRootElement().getText();
System.out.println("Dữ liệu nhận được: " + ketQua);
// Trả về kết quả
response.setContentType("text/html; charset=UTF-8");
response.getWriter().print("Thông báo từ máy chủ: Thành công rồi! no(∩_∩)o... haha!");
Các phương thức mã hóa trong JavaScript:
Khi truyền tham số qua URL, nếu trang gửi sử dụng GB2312 còn trang nhận dùng UTF-8, sẽ xảy ra lỗi chuyển đổi. Các hàm mã hóa khác nhau có thể dẫn đến kết quả khác biệt.
- escape(): Mã hóa theo ISO Latin, tất cả các ký tự không ASCII sẽ được chuyển thành %xx.
- encodeURI(): Mã hóa URI dạng UTF-8, bỏ qua các ký tự đặc biệt như ! @ # $ & * ( ) = : / ; ? + ' .
- encodeURIComponent(): Mã hóa từng phần của URI, bao gồm nhiều ký tự hơn encodeURI(), như /.
Ví dụ sử dụng escape:
var chuoi = "Xin chào thế giới!";
var maHoa = escape(chuoi);
console.log(maHoa); // Kết quả: Xin%20ch%C3%A0o%20th%E1%BA%BF%20gi%E1%BB%9Bi%21
Ghi chú: Nếu trang nguồn và đích có cùng charset, dùng escape(). Nếu khác, ưu tiên encodeURI() hoặc encodeURIComponent().