Tất cả bài viết

URL Encode/Decode: percent-encoding trong liên kết

Tiếng Việt dùng chữ Latinh nhưng gần như mọi từ đều mang dấu thanh điệu — "phở", "được", "nguyễn" — nên khi đưa vào URL, mỗi ký tự có dấu phải chuyển thành percent-encoding thay vì giữ nguyên.

Vì sao một chữ có dấu lại "nặng" hơn nhiều

Mỗi ký tự tiếng Việt có dấu được mã hóa UTF-8 thành 2-3 byte, rồi mỗi byte lại viết thành %XX — chữ "ế" trở thành %E1%BA%BF, một ký tự thành 9 ký tự mã hóa. Một từ ngắn như "Nguyễn" sau khi encode dễ dàng vượt quá 25 ký tự, khiến link chia sẻ qua Zalo — ứng dụng nhắn tin phổ biến nhất Việt Nam — trông dài hơn hẳn so với nội dung gốc.

encodeURIComponent và encodeURI khác nhau thế nào

encodeURIComponent mã hóa gần như mọi ký tự có ý nghĩa cấu trúc — &, ?, =, / — nên phù hợp cho một giá trị tham số duy nhất, ví dụ từ khóa tìm kiếm đưa vào ?q=. encodeURI giữ nguyên các ký tự cấu trúc đó vì được thiết kế để mã hóa cả một URL hoàn chỉnh đã dựng sẵn.

Lỗi thường gặp khi tạo link Zalo hoặc form đặt hàng

Khi tạo link đặt hàng có tham số như tên khách hàng hoặc địa chỉ chứa dấu tiếng Việt, nếu mã hóa toàn bộ chuỗi query cùng lúc bằng encodeURIComponent, các ký tự &= ngăn cách tham số cũng bị biến thành %26%3D — server nhận về một tham số duy nhất không đọc được thay vì nhiều giá trị tách biệt.

Khi nào cần dùng

  • Đưa từ khóa tìm kiếm hoặc tên sản phẩm có dấu vào tham số query.
  • Tạo link Zalo hoặc form đặt hàng có sẵn nội dung tiếng Việt.
  • Gỡ lỗi: decode một URL để xem dữ liệu thật đằng sau các mã %XX.

Trường hợp đặc biệt: encode hai lần

Nếu một chuỗi đã được encode lại bị encode thêm lần nữa, chính ký tự % sẽ biến thành %25, khiến kết quả trở thành một chuỗi rối không đọc được (%E1%BA%BF thành %25E1%25BA%25BF). Lỗi này thường xảy ra khi một framework đã tự động encode URL, còn lập trình viên lại gọi thêm encodeURIComponent thủ công trên giá trị đã được encode sẵn.

Dùng thử công cụ