Tiêu chuẩn UTF-8 - Định dạng chuyển đổi mã ký tự Unicode



Tiêu chuẩn UTF-8 - Định dạng chuyển đổi mã ký tự toàn cầu 8 bít

Tổng quan về UTF-8

Tiêu chuẩn 8-bít Universal Character Set (UCS) Transformation Format (UTF-8) – Định dạng chuyển đổi mã ký tự toàn cầu là một tiêu chuẩn do Nhóm chuyên trách kỹ thuật Internet - Internet Engineering Task Force (IETF) phát hành. ISO/IEC 10646 định nghĩa một bộ ký tự lớn được gọi là Tập ký tự toàn cầu (Universal Character Set - UCS), trong đó bao gồm hầu hết các hệ thống xử lý văn bản trên thế giới. Tương tự, Hệ thống mã hóa ký tự Unicode cũng định nghĩa một bộ ký tự như UCS nhưng có thêm những thuộc tính ký tự bổ sung khác với UCS. Các kiểu mã hóa ban đầu được đề xuất của UCS không tương thích với nhiều ứng dụng và giao thức hiện tại và điều này đã dẫn đến sự phát triển của UTF-8. UTF-8 có đầy đủ các ký tự của US-ASCII (United State - American Standard Code for Information Interchange - Tiêu chuẩn mã hóa trao đổi thông tin của Hoa Kỳ) nên tương thích với các hệ thống tập tin, bộ phân tích cú pháp và phần mềm khác dựa trên giá trị US-ASCII.

UTF-8 phiên bản 1 được IETF công bố lần đầu vào tháng 10/1996 tại RFC 2044. Tháng 01/1998, UTF-8 phiên bản 2 (thay thế phiên bản 1) được công bố tại RFC 2279. Đến tháng 11/2003, IETF công bố UTF-8 phiên bản 3 (thay thế phiên bản 2) tại RFC 3629. Trong đó, RFC (Request for Comments) là những tài liệu kỹ thuật và tổ chức về Internet, bao gồm những tài liệu đặc tả kỹ thuật và chính sách được tổ chức IETF phát hành

Đặc điểm của UTF-8

ISO/IEC 10646 và Unicode xác định một số hình thức mã hóa chung: UTF-8, UCS-2, UTF-16, UCS-4 và UTF-32. Trong mỗi hình thức mã hóa, mỗi ký tự được biểu diễn nhiều hơn một đơn vị mã hóa. Tất cả các hình thức mã hóa UCS tiêu chuẩn đều có một đơn vị mã hóa lớn hơn một octet, điều này làm chúng khó sử dụng trong nhiều ứng dụng và giao thức sử dụng ký tự 8 bít hay thậm chí là 7 bít, ngoại trừ UTF-8.

Đơn vị mã hóa của UTF-8 là một octet. Nó sử dụng tất cả các bít của một octet, nhưng có đầy đủ các khoảng ký tự của US-ASCII: ký tự US-ASCII được mã hóa trong một octet có giá trị US-ASCII bình thường và bất kỳ giá trị nào của octet chỉ có thể biểu diễn một ký tự US-ASCII.

UTF-8 mã hóa ký tự UCS bằng nhiều octet, trong đó số octet và giá trị của mỗi octet phụ thuộc vào giá trị số nguyên gán cho các ký tự trong ISO/IEC 10646 (số lượng ký tự, vị trí mã, điểm mã hoặc giá trị vô hướng Unicode). Hình thức mã hóa này có những đặc điểm sau (tất cả các giá trị ở dạng hệ thập lục phân):

- Các ký tự từ U+0000 đến U+007F (hình thức mã hóa US-ASCII) tương ứng với các octet từ 00 đến 7F (giá trị 7 bít US-ASCII). Một chuỗi ký tự ASCII cũng là một chuỗi UTF-8 hợp lệ.

- Các giá trị octet US-ASCII không xuất hiện trừ trường hợp một chuỗi ký tự UTF-8 mã hóa. Điều này tương thích với các hệ thống tập tin hoặc phần mềm khác (ví dụ hàm printf() trong thư viện C) mà việc phân tích cú pháp dựa trên các giá trị US-ASCII nhưng là trong suốt đối với các giá trị khác.

- Chuyển đổi dễ dàng giữa UTF-8 và hình thức mã hóa khác.

- Octet đầu tiên của một chuỗi octet cho biết số octet trong chuỗi.

- Các giá trị octet C0, C1, F5 đến FF không bao giờ xuất hiện.

- Dễ dàng tìm thấy các biên ký tự (giới hạn phân cách giữa các ký tự) từ bất kỳ vị trí nào trong một octet.

- Thứ tự sắp xếp byte giá trị của chuỗi UTF-8 giống thứ tự các ký tự.

- Thuật toán tìm kiếm nhanh Boyer-Moore có thể được sử dụng với dữ liệu UTF-8.

- Các chuỗi UTF-8 có thể nhận dạng khá tin cậy bởi một thuật toán đơn giản, tức là xác suất để một chuỗi các ký tự xuất hiện UTF-8 hợp lệ trong dạng mã hóa khác khá thấp, sẽ giảm bớt sự gia tăng chiều dài chuỗi.

Trong UTF-8, các ký tự trong dải U+0000 .. U+10FFFF (phạm vi truy cập UTF-16) được mã hóa sử dụng từ 1 đến 4 octet. Đặt octet duy nhất của một "chuỗi" có bít thứ tự cao hơn thành 0; 7 bít còn lại được sử dụng để mã hóa các ký tự. Trong một chuỗi có n octet (n > 1), với octet đầu tiên, các bít thứ tự cao hơn đặt thành 1, bít ngay tiếp theo đặt thành 0. Các bít còn lại của octet để mã hóa các ký tự. Trong các octet còn lại, bít thứ tự cao hơn đặt thành 1 và bít ngay tiếp theo đặt thành 0, để lại 6 bít để mã hóa các ký tự. Bảng dưới đây tóm tắt định dạng của các loại octet khác nhau. Chữ cái x chỉ các bít để mã hóa các ký tự.

Bảng 1 – Định dạng của các loại octet khác nhau

|Phạm vi số ký tự (Hệ thập lục phân) |Chuỗi octet UTF-8 (nhị phân) |

|0000 0000-0000 007 F |0xxxxxxx |

|0000 0080-0000 07FF |110xxxxx 10xxxxxx |

|0000 0800-0000 FFFF |1110xxxx 10xxxxxx 10xxxxxx |

|0001 0000-0010 FFFF |11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |

(Nguồn: RFC 3269, UTF-8, a transformation format of ISO 10646)

Quá trình mã hóa một ký tự thành UTF-8 như sau:

1. Xác định số lượng các octet yêu cầu từ số lượng ký tự và cột đầu tiên của Bảng 1. Điều quan trọng cần lưu ý chỉ có một cách hợp lệ để mã hóa một ký tự nhất định.

2. Chuẩn bị các bít có thứ tự cao hơn của các octet theo cột thứ hai của Bảng 1.

3. Điền vào các bít đánh dấu x từ các bít ký tự thể hiện trong hệ nhị phân. Bắt đầu bằng cách đặt bít ký tự có thứ tự thấp nhất vào octet cuối cùng của chuỗi có vị trí thấp nhất, sau đó đặt bít ký tự tiếp theo có thứ tự cao hơn vào octet tiếp theo có vị trí cao hơn... Khi các bít x của octet cuối cùng được điền vào, chuyển đến octet cạnh octet cuối cùng, sau đó lặp lại bước 1... cho đến khi tất cả bít x được điền vào

UTF-8 không cho phép mã hóa các ký tự giữa U+D800 và U+DFFF, mà dành riêng để sử dụng cho hình thức mã hóa UTF-16 (là các cặp thay thế) và không trực tiếp biểu diễn các ký tự. Khi mã hóa theo dạng UTF-8 từ dữ liệu UTF-16, đầu tiên cần giải mã dữ liệu UTF-16 để có được số ký tự, sau đó mã hóa theo UTF-8 như mô tả ở trên. Điều này trái ngược CESU-8 (Compatibility Encoding Scheme for UTF-16: 8-Bit), là một biến thể mã hóa dạng UTF-8 nhưng không sử dụng trên Internet. CESU-8 hoạt động tương tự như UTF-8 nhưng mã hóa các giá trị mã UTF-16 (16-bít) thay vì các ký tự (điểm mã). Điều này dẫn đến kết quả khác nhau với số ký tự trên 0xFFFF; CESU-8 mã hóa cả những ký tự là không hợp lệ trong UTF-8.

Quá trình giải mã một ký tự UTF-8 như sau:

1. Khởi tạo một số nhị phân với tất cả các bít thiết lập là 0, có thể lên đến 21 bít nếu cần thiết.

2. Xác định các bít mã hóa các ký tự từ số octet trong dãy và cột thứ hai của Bảng 1 (các bít đánh dấu x).

3. Điền các bít trong dãy thành các số nhị phân, bắt đầu từ các bít có số thứ tự thấp hơn so với octet cuối cùng của chuỗi và tiếp tục về bên trái cho đến khi không còn bít x. Số nhị phân bây giờ đã bằng với số ký tự.

Khi cài đặt UTF-8, cần chống lại việc giải mã các chuỗi không hợp lệ. Ví dụ, giải mã chuỗi UTF-8 quá dài C0 80 thành ký tự U+0000 hoặc cặp thay thế ED A1 8C ED BE B4 thành U+233B4. Giải mã ký tự không hợp lệ có thể gây ra những vấn đề bảo mật hoặc vấn đề khác.

Ứng dụng

UTF-8 là bộ mã hóa kí tự được sử dụng phổ biến trong hầu hết các trang thông tin trên mạng Internet, được Tổ chức thư Internet khuyến nghị sử dụng trong các chương trình thư điện tử. UTF-8 được sử dụng là bộ mã hóa ký tự trong các hệ điều hành, ngôn ngữ lập trình, giao diện lập trình ứng dụng hay trong các ứng dụng phần mềm. Trong Thông tư 01/2011/TT-BTTTT ngày 04/01/2011 của Bộ trưởng Bộ Thông tin và Truyền thông Công bố Danh mục tiêu chuẩn kỹ thuật về ứng dụng công nghệ thông tin trong cơ quan nhà nước quy định Bắt buộc áp dụng tiêu chuẩn UTF-8 và được xếp vào nhóm Tiêu chuẩn về tích hợp dữ liệu.

Viết tắt/Thuật ngữ

|Bit |Đơn vị cơ bản nhất của thông tin trong máy tính, có giá trị là 0 hoặc 1 |

|Byte |Một đơn vị của thông tin trong máy tính có độ lớn bằng 8 bit |

|Octet |Một đơn vị của thông tin trong máy tính có độ lớn bằng 8 bit. Thuật ngữ Octet thường được sử dụng nhiều hơn thuật |

| |ngữ Byte trong các tài liệu kỹ thuật chính thức |

Trần Việt Cường – Cục Ứng dụng công nghệ thông tin

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download