Qua nhiều năm từ việc đọc các thông số kỹ thuật phát triển, tôi đã giả định rằng RFC 3986 cuối cùng đã được giải quyết trên mã hóa UTF-8 cho chuỗi octet thoát. Nghĩa là, nếu URI của tôi có %XX%YY%ZZ
, tôi có thể lấy chuỗi các octet đã giải mã đó (đối với bất kỳ URI nào trong phần cụ thể của chương trình) và diễn giải các byte kết quả dưới dạng UTF-8 để tìm ra thông tin được giải mã nào được dự định. Về mặt thực tế, tôi có thể gọi JavaScript decodeURIComponent()
, điều này tự động giải mã cho tôi.Bảng mã trong dữ liệu URI
Sau đó, tôi đọc thông số kỹ thuật cho data:
URI, RFC 2397, bao gồm đối số charset
, trong đó (tự nhiên) biểu thị bộ ký tự của dữ liệu được mã hóa. Nhưng nó hoạt động như thế nào? Nếu tôi có chuỗi được mã hóa hai octet %XX%YY
trong URI data:
của tôi, thì charset=iso-8859-1
chỉ ra rằng hai octect được giải mã phải không được hiểu là chuỗi UTF-8, nhưng như hai ký tự La-tinh riêng biệt (như mỗi byte trong ISO -8859-1 đại diện cho một nhân vật)? RFC 2397 dường như biết điều này, vì nó đưa ra một ví dụ về "nhân vật Hy Lạp [sic]":
data:text/plain;charset=iso-8859-7,%be%fg%be
Nhưng điều này có nghĩa rằng JavaScript decodeURIComponent()
(mà giả octet mã hóa UTF-8) không thể được sử dụng để trích xuất một chuỗi từ URI dữ liệu, đúng không? Điều này có nghĩa là tôi phải tạo giải mã của riêng mình cho các URI dữ liệu nếu bộ mã là gì đó ngoài UTF-8?
Hơn nữa, điều này có nghĩa là RFC 2397 hiện đang xung đột với RFC 3986, điều này dường như chỉ ra rằng UTF-8 được giả định? Hoặc RFC 3986 chỉ đề cập đến "lược đồ URI mới", có nghĩa là lược đồ URI data:
được đưa vào và có kỹ thuật riêng của nó để chỉ định các octet được mã hóa có nghĩa là gì?
Dự đoán tốt nhất của tôi tại thời điểm này là data:
phát theo các quy tắc của riêng nó và nếu nó biểu thị bộ ký tự không phải là UTF-8, tôi sẽ phải sử dụng một số khác ngoài decodeURIComponent()
trong JavaScript. Mọi khuyến nghị về phương pháp thay thế cũng sẽ được hoan nghênh.