Tất cả bài viết

Unicode Escape: chuỗi \uXXXX nghĩa là gì

Một chữ tiếng Việt như "ế" có thể mang tới hai dấu cùng lúc — dấu mũ và dấu sắc — và tùy vào việc văn bản được lưu ở dạng dựng sẵn (precomposed, một điểm mã) hay dạng tổ hợp (decomposed, chữ cái gốc cộng các dấu riêng), số lượng escape code sinh ra cho cùng một chữ có thể hoàn toàn khác nhau.

Vì sao cùng một chữ có thể ra hai kết quả escape khác nhau

Ở dạng dựng sẵn (NFC), "ế" là một điểm mã duy nhất và cho ra đúng một escape code như \u1ebf. Ở dạng tổ hợp (NFD), cùng một chữ lại là ba điểm mã riêng biệt — "e" cộng dấu mũ tổ hợp cộng dấu sắc tổ hợp — và sinh ra ba escape code liên tiếp trông hoàn toàn khác. Cả hai đều hiển thị giống hệt nhau trên màn hình, nhưng là hai chuỗi byte khác nhau.

JSON và chuỗi thoát

Đặc tả JSON cho phép escape bất kỳ ký tự nào trong chuỗi thành \uXXXX. Điều này thường gặp khi dữ liệu được tạo tự động và bộ tuần tự hóa cố tình tránh các ký tự ngoài ASCII để đảm bảo tương thích — một từ có nhiều dấu như "nghiêng" có thể tạo ra một chuỗi escape dài hơn nhiều so với một từ tiếng Anh cùng độ dài.

Khi nào cần dùng

  • Đọc bằng ngôn ngữ dễ hiểu văn bản nào đang ẩn sau các chuỗi thoát trong phản hồi JSON của một API.
  • Chuẩn bị một chuỗi cho môi trường không chấp nhận ký tự ngoài ASCII.
  • Chẩn đoán sự cố mã hóa khi làm việc với dữ liệu bên ngoài, đặc biệt khi văn bản đến từ hệ thống chuẩn hóa Unicode khác (NFC so với NFD).

Lỗi thường gặp: cặp thay thế bị vỡ

Nếu cắt một chuỗi hoặc xử lý từng mã thoát riêng lẻ mà không tính đến cặp thay thế (surrogate pair) dùng cho ký tự ngoài mặt phẳng cơ bản, có thể tách mã đầu của cặp khỏi mã thứ hai. Kết quả là một ký tự "mồ côi" không hợp lệ, mà hầu hết trình phân tích sẽ từ chối kèm lỗi, hoặc hiển thị thành ký tự thay thế "�".

Dùng thử công cụ