2013-05-25 88 views
8

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.

Trả lời

5

Hãy nhớ rằng chương trình data: URI mô tả một nguồn tài nguyên có thể được coi như là một tập tin trong đó bao gồm một bytestream đục cũng giống như thể đó là một http: URI (các bytestream tương tự, nhưng được lưu trữ trên một máy chủ HTTP) hoặc một ftp: URI (cùng một luồng, nhưng được lưu trữ trên máy chủ FTP) hoặc một URI file: (cùng một luồng, nhưng được lưu trữ trên hệ thống tệp cục bộ của bạn). Chỉ siêu dữ liệu được đính kèm vào tệp mới có nghĩa là có nghĩa là bytestream.

RFC 2397 đưa ra một đặc điểm kỹ thuật rõ ràng về cách nó được nhúng vào chính URI (ngược lại với các lược đồ URI khác, trong đó URI đưa ra các hướng dẫn về nơi tìm nạp luồng lân cận, không phải nội dung chứa). Nó có thể là base64 hoặc nó có thể là phương pháp mã hóa phần trăm được đưa ra trong RFC. Base64 sẽ gọn nhẹ hơn nếu byte gần nhất chứa byte không phải ASCII của con người.

URI data: URI cũng mô tả Loại nội dung của riêng nó, cung cấp giải thích dự định của luồng. Trong trường hợp này, vì bạn đã sử dụng text/plain;charset=iso-8859-7, các byte phải được mã hóa chính xác văn bản ISO-8859-7. Các byte chắc chắn sẽ là không được quyết định là UTF-8 hoặc bất kỳ mã hóa ký tự nào khác. Nó sẽ được giải mã rõ ràng bằng cách sử dụng mã hóa ký tự mà bạn đã chỉ định.