Logo của Hiệp hội Unicode. | |
Tên gọi khác | Universal Coded Character Set (UCS) |
---|---|
Ngôn ngữ | International |
Chuẩn | Unicode Standard |
Định dạng mã hóa |
|
Thay thế cho | ISO/IEC 8859, various others |
Unicode (hay còn gọi là mã ký tự quốc tế; mã ký tự toàn cầu) là bộ mã chuẩn toàn cầu được phát triển để sử dụng làm mã chung cho tất cả các ngôn ngữ trên thế giới, bao gồm cả những ngôn ngữ sử dụng ký tự phức tạp như chữ Hán trong tiếng Trung Quốc, tiếng Nhật, chữ Nôm trong tiếng Việt, và nhiều loại chữ viết khác. Nhờ những ưu điểm nổi bật của nó, Unicode đang dần thay thế các bộ mã cũ như ISO 8859. Unicode hiện đang được áp dụng rộng rãi trên nhiều phần mềm và ứng dụng, ví dụ như Windows.
Phiên bản mới nhất hiện tại là Unicode® 15.0, được công bố vào ngày 13 tháng 9 năm 2022.
Hiệp hội Unicode
Hiệp hội Unicode có trụ sở tại California đã phát hành phiên bản đầu tiên của The Unicode Standard (Tiêu chuẩn Unicode) vào năm 1991 và liên tục cập nhật, hoàn thiện tiêu chuẩn này. Các phiên bản mới được xây dựng dựa trên các phiên bản trước đó, đảm bảo sự tương thích. Cần lưu ý rằng Unicode và tiêu chuẩn ISO 10646 là hai khái niệm độc lập; ISO 10646 là tiêu chuẩn quốc tế chính thức, trong khi Unicode được phát triển bởi Unicode Consortium (tập hợp các công ty công nghệ lớn). Từ năm 1991, nhóm làm việc của ISO và Liên đoàn Unicode đã hợp tác chặt chẽ để đảm bảo tính tương thích, chẳng hạn như sự đồng nhất về vị trí của các ký tự (ví dụ: chữ ơ là 01A1
). Trong khi Unicode do Liên đoàn Unicode phát triển, tổ chức này bao gồm các công ty lớn như Microsoft, Adobe Systems, IBM, Novell, Sun Microsystems, Lotus Software, Symantec và Unisys. (Danh sách chi tiết tại: [1]). Unicode không chỉ quy định bộ mã mà còn quy định cách dựng hình, mã hóa (sử dụng 1, 2, 3 hoặc 4 byte để biểu diễn một ký tự (ví dụ: UTF-8), cách sắp xếp (collation) các ký tự, và nhiều đặc tính khác, bao gồm hỗ trợ các ngôn ngữ viết từ phải sang trái như tiếng Ả Rập.
Bộ ký tự
Unicode bao gồm 1.114.112 mã ký tự (tính theo 2^20) và hiện tại đã có hơn 96.000 ký tự được gán mã. 256 ký tự đầu tiên tương thích với ISO 8859-1, một phương pháp mã hóa phổ biến trong 'thế giới phương Tây'; vì thế, 128 ký tự đầu tiên cũng được sử dụng theo tiêu chuẩn ASCII.
Không gian mã của Unicode được chia thành 17 mặt phẳng (plane), mỗi mặt phẳng có 65.536 code point. Mặt phẳng đầu tiên (plane 0), gọi là 'Mặt phẳng đa ngôn ngữ cơ bản' (Basic Multilingual Plane - BMP), chứa hầu hết các ký hiệu được mã hóa. BMP bao gồm các ký tự cho hầu hết các ngôn ngữ hiện đại cùng với nhiều ký tự đặc biệt. Đa số code point trong BMP được dùng để mã hóa các ngôn ngữ CJKV (Hán-Nhật-Hàn-Việt).
Hai mặt phẳng tiếp theo được dùng cho các ký tự 'đồ họa'. Mặt phẳng 1, 'Mặt phẳng đa ngôn ngữ bổ sung' (Supplementary Multilingual Plane - SMP), chủ yếu chứa các loại chữ viết cổ như chữ tượng hình Ai Cập (chưa được mã hóa), cùng với một số ký hiệu âm nhạc. Mặt phẳng 2, (Supplementary Ideographic Plane - SIP), chứa khoảng 40.000 ký tự Trung Quốc ít gặp, chủ yếu là các ký hiệu cổ, cùng với một số ký hiệu hiện đại. Mặt phẳng 14 hiện chứa một số ký tự ngôn ngữ không được khuyến khích và một số ký hiệu lựa chọn biến thể. Mặt phẳng 15 và Mặt phẳng 16 được dành cho các sử dụng cá nhân.
Kho chữ của Unicode ≈2 điểm mã đảm bảo tính tương thích với bộ mã UTF-16. Với việc mới chỉ sử dụng khoảng 10% kho chữ, cho thấy rằng không gian mã ≈20 bit khó có khả năng bị đầy trong thời gian gần.
Danh sách mã
Cho đến giờ, chúng ta chỉ biết rằng Unicode là hệ thống phân số duy nhất cho tất cả các ký tự trong các ngôn ngữ viết của con người. Tuy nhiên, các số này được biểu diễn trong các hệ thống xử lý văn bản lại là vấn đề khác; đó là hậu quả của việc hầu hết các phần mềm ở phương Tây chỉ hỗ trợ hệ thống mã hóa 8-bit, và việc tích hợp Unicode vào các phần mềm chỉ mới được thực hiện một cách chậm rãi trong những năm gần đây.
Các chương trình 8-bit cũ chỉ nhận diện các ký tự 8 bit và không thể xử lý hơn 256 điểm mã mà không có các giải pháp đặc biệt. Do đó, nhiều cơ chế đã được phát triển để sử dụng Unicode; tùy thuộc vào khả năng lưu trữ, sự tương thích với chương trình gốc và tương tác với các hệ thống khác mà mỗi người chọn một cơ chế thích hợp.
UTF-32
Phương pháp đơn giản nhất để lưu trữ tất cả các điểm mã Unicode là sử dụng 32 bit cho mỗi ký tự, tương đương với 4 byte – vì vậy phương pháp mã hóa này được Unicode gọi là UTF-32 và ISO/IEC 10646 gọi là UCS-4. Vấn đề chính của phương pháp này là nó chiếm không gian nhiều gấp 4 lần so với trước đây, do đó ít được sử dụng trong các bộ nhớ ngoài (như đĩa, băng). Tuy nhiên, nó rất đơn giản, vì vậy một số chương trình sẽ sử dụng mã hóa 32 bit khi xử lý Unicode.
UTF-16
UTF-16 là phương pháp mã hóa sử dụng Unicode với 20 bit. Các ký tự trong BMP được biểu diễn bằng giá trị 16-bit của code point trong Unicode CCS. Có hai cách để lưu trữ giá trị 16 bit trong một dòng 8-bit. Bạn có thể đã nghe đến thuật ngữ endian. Big Endian có nghĩa là byte quan trọng nhất (Most Significant Byte) đứng trước, tức là bên trái – vì vậy ta có UTF-16BE. Còn Little Endian thì ngược lại, tức là byte ít quan trọng nhất (Least Significant Byte) đứng trước – do đó ta có UTF-16LE. Ví dụ, giá trị 16-bit của số Hex1234 sẽ là Hex12 Hex34 trong Big Endian và Hex34 Hex12 trong Little Endian.
Các ký hiệu không thuộc BMP được biểu diễn bằng cách sử dụng surrogate pair (cặp thay thế). Các code points có giá trị từ U+D800 đến U+DFFF được dành riêng cho mục đích này. Đầu tiên, một code point 20 bit được chia thành hai nhóm 10 bit. Nhóm 10 bit quan trọng nhất được ánh xạ vào một giá trị 10 bit trong khoảng từ U+D800 đến U+DBFF. Nhóm 10 bit ít quan trọng nhất được ánh xạ vào một giá trị 10 bit trong khoảng từ U+DC00 đến U+DFFF. Bằng cách này, UTF-16 có thể biểu diễn các ký hiệu Unicode 20 bit.
UTF-8
UTF-8 là phương pháp mã hóa nhằm mục đích giống như UCS-4 (hoặc UTF-16), mà không cần sử dụng code point khác. UTF-8 được thiết kế để tương thích với chuẩn ASCII. UTF-8 có thể sử dụng từ một (cho các ký tự trong ASCII) đến 6 byte để biểu diễn một ký tự.
Nhờ tính tương thích với ASCII, UTF-8 mang lại lợi ích lớn khi được sử dụng để tích hợp Unicode vào các phần mềm hiện có. Hơn nữa, các nhà phát triển phần mềm có thể tiếp tục sử dụng các hàm thư viện của ngôn ngữ lập trình C để so sánh và sắp xếp. Ngược lại, việc hỗ trợ các phương pháp mã hóa 16 bit hoặc 32 bit thường đòi hỏi phải viết lại nhiều phần mềm, điều này tốn kém nhiều công sức. Một ưu điểm khác của UTF-8 là khi xử lý văn bản chỉ chứa ít ký tự ngoài ASCII hoặc cho các ngôn ngữ sử dụng bảng chữ cái Latinh như tiếng Việt, tiếng Pháp, tiếng Tây Ban Nha, v.v.; phương pháp mã hóa này rất tiết kiệm không gian lưu trữ.
UTF-8 được thiết kế để đảm bảo rằng không có chuỗi byte nào của một ký tự nằm trong chuỗi của ký tự khác dài hơn. Điều này làm cho việc tìm kiếm ký tự theo byte trong văn bản trở nên dễ dàng. Một số phương pháp mã hóa khác (như Shift-JIS) không có tính năng này, khiến việc xử lý chuỗi ký tự trở nên phức tạp hơn. Dù việc này yêu cầu văn bản dài hơn, những lợi ích mà nó mang lại vẫn lớn hơn. Nén dữ liệu không phải là mục tiêu của Unicode và cần được thực hiện độc lập.
Các quy định cụ thể của UTF-8 như sau (các số bắt đầu bằng 0x là các số trong hệ thập lục phân)
- Ký tự có giá trị nhỏ hơn 0x80, sử dụng 1 byte với giá trị tương ứng.
- Ký tự có giá trị nhỏ hơn 0x800, sử dụng 2 byte: byte đầu tiên có giá trị 0xC0 cộng với 5 bit từ vị trí 7 đến 11; byte thứ hai có giá trị 0x80 cộng với các bit từ vị trí 1 đến 6.
- Ký tự có giá trị nhỏ hơn 0x10000, sử dụng 3 byte: byte đầu tiên có giá trị 0xE0 cộng với 4 bit từ vị trí 13 đến 16; byte thứ hai có giá trị 0x80 cộng với 6 bit từ vị trí 7 đến 12; byte thứ ba có giá trị 0x80 cộng với 6 bit từ vị trí 1 đến 6.
- Ký tự có giá trị nhỏ hơn 0x200000, sử dụng 4 byte: byte đầu tiên có giá trị 0xF0 cộng với 3 bit từ vị trí 19 đến 21; byte thứ hai có giá trị 0x80 cộng với 6 bit từ vị trí 13 đến 18; byte thứ ba có giá trị 0x80 cộng với 6 bit từ vị trí 7 đến 12; byte thứ tư có giá trị 0x80 cộng với 6 bit từ vị trí 1 đến 6.
Hiện tại, các giá trị ngoài các giá trị trên chưa được sử dụng. Tuy nhiên, các chuỗi ký tự dài đến 6 byte có thể được áp dụng trong tương lai.
- Chuỗi 5 byte có thể lưu trữ mã ký tự lên đến 26 bit: byte đầu tiên có giá trị 0xF8 cộng với 2 bit thứ 25 và 26, các byte tiếp theo lưu giá trị 0x80 cộng với 6 bit mang ý nghĩa tiếp theo.
- Chuỗi 6 byte có thể lưu trữ mã ký tự lên đến 31 bit: byte đầu tiên có giá trị 0xFC cộng với bit thứ 31, các byte tiếp theo lưu giá trị 0x80 cộng với 6 bit mang ý nghĩa tiếp theo.
UTF-7
NaN sẽ được mã hóa thành NaN
Các vấn đề khác
Tiêu chuẩn Unicode còn bao gồm nhiều vấn đề liên quan như thuộc tính ký tự, các dạng chuẩn hóa văn bản và thứ tự hiển thị bidirectional (để hiển thị chính xác các văn bản có chứa cả hai loại ngôn ngữ viết từ phải qua trái như tiếng Ả Rập hoặc tiếng Hebrew và từ trái qua phải).
Unicode toàn cầu
Phần lớn các trang web tiếng Việt hiện nay sử dụng mã hóa UTF-8 để đảm bảo tính tương thích. Tuy nhiên, vẫn có một số trang web còn sử dụng mã hóa theo chuẩn ISO-8859-1 cũ. Các trình duyệt hiện đại như Mozilla Firefox có tính năng tự động chọn mã hóa phù hợp nếu máy tính đã cài đặt font chữ tương thích (tham khảo thêm Unicode và HTML).
Dù các quy tắc cú pháp có thể ảnh hưởng đến thứ tự của các ký tự, các tài liệu HTML 4.0 và XML 1.0 có khả năng bao phủ gần như tất cả các ký tự trong Unicode, ngoại trừ một số ký tự điều khiển và dãy chưa được định nghĩa như D800-DFFF và FFFE-FFFF. Các ký tự này có thể là byte nếu bộ mã có định nghĩa hoặc chuỗi số Unicode nếu bộ mã không có định nghĩa. Ví dụ: Δ
Й
ק
م
๗
ぁ
叶
葉
냻
sẽ được hiển thị là Δ, Й, ק, م, ๗, ぁ, 叶, 葉 và 냻 nếu máy tính có cài đặt font tương thích. Những ký tự này tương ứng với chữ 'Delta' trong bảng chữ cái Hy Lạp, 'I ngắn' trong bảng chữ cái Cyril, 'Meem' trong bảng chữ cái Ả Rập, 'Qof' trong bảng chữ cái Hebrew, số 7 trong bảng chữ cái Thái, Hiragana 'A' trong tiếng Nhật, chữ Hán 'diệp' giản thể, chữ Hán 'diệp' phồn thể và âm 'Nyrh' bằng Hangul trong tiếng Hàn/Triều Tiên.
Phông chữ Unicode
Phông chữ Unicode có thể được tải từ nhiều trang web và phần lớn là miễn phí. Mặc dù có hàng ngàn phông chữ có sẵn, phần lớn chúng chỉ hỗ trợ một số ký hiệu ngoài ASCII của Unicode ở mức độ nhất định. Các phông chữ Unicode thường tập trung vào việc hỗ trợ các ký tự ASCII và một số chữ viết cụ thể hoặc tập hợp các ký tự và ký hiệu. Nguyên nhân có thể là: các ứng dụng và tài liệu thường không cần hiển thị ký tự từ nhiều hệ thống chữ viết; phông chữ thường không đầy đủ; hệ điều hành và các ứng dụng ngày càng cải thiện khả năng xử lý ký tự từ nhiều bộ phông khác nhau. Hơn nữa, việc thiết kế một hệ thống chi tiết với hàng nghìn ký tự đòi hỏi rất nhiều thời gian và công sức mà không mang lại lợi ích đáng kể.
Các phông chữ Unicode như Times New Roman, Tahoma, và Arial hỗ trợ gõ tiếng Việt.
Lịch sử các phiên bản Unicode
Phiên bản | Ngày phát hành | Sách | Ấn bản ISO/IEC 10646 tương ứng | Số hệ chữ viết | Số ký tự |
---|---|---|---|---|---|
1.0.0 | 10/1991 | ISBN 0-201-56788-1 (quyển 1) | 24 | 7.161 | |
1.0.1 | 6/1992 | ISBN 0-201-60845-6 (quyển 2) | 25 | 28.359 | |
1.1 | 6/1993 | ISO/IEC 10646-1:1993 | 24 | 34.233 | |
2.0 | 7/1996 | ISBN 0-201-48345-9 | ISO/IEC 10646-1:1993 cùng với các Tu chính án 5–7 | 25 | 38.950 |
2.1 | 5/1998 | ISO/IEC 10646-1:1993 cùng với các Tu chính án 5–7 cũng như hai ký tự từ Tu chính án 18 | 25 | 38.952 | |
3.0 | 9/1999 | ISBN 0-201-61633-5 | ISO/IEC 10646-1:2000 | 38 | 49.259 |
3.1 | 3/2001 | ISO/IEC 10646-1:2000
ISO/IEC 10646-2:2001 |
41 | 94.205 | |
3.2 | 3/2002 | ISO/IEC 10646-1:2000 cùng với Tu chính án 1
ISO/IEC 10646-2:2001 |
45 | 95.221 | |
4.0 | 4/2003 | ISBN 0-321-18578-1 | ISO/IEC 10646:2003 | 52 | 96.447 |
4.1 | 3/2005 | ISO/IEC 10646:2003 cùng với Tu chính án 1 | 59 | 97.720 | |
5.0 | 7/2006 | ISBN 0-321-48091-0 | ISO/IEC 10646:2003 cùng với các Tu chính án 1 và 2, cũng như 4 ký tự từ Tu chính án 3 | 64 | 99.089 |
5.1 | 4/2008 | ISO/IEC 10646:2003 cùng với các Tu chính án 1–4 | 75 | 100.713 | |
5.2 | 10/2009 | ISO/IEC 10646:2003 cùng với các Tu chính án 1–6 | 90 | 107.361 | |
6.0 | 10/2010 | ISO/IEC 10646:2010 cùng với dấu rupee Ấn Độ | 93 | 109.449 | |
6.1 | 1/2012 | ISO/IEC 10646:2012 | 100 | 110.181 | |
6.2 | 9/2012 | ISO/IEC 10646:2012 cùng với dấu lira Thổ Nhĩ Kỳ | 100 | 110.182 | |
6.3 | 9/2013 | ISBN 978-1-936213-08-5 | ISO/IEC 10646:2012 cùng với 6 ký tự | 100 | 110.187 |
7.0 | 6/2014 | ISBN 978-1-936213-09-2 | ISO/IEC 10646:2012 cùng với các Tu chính án 1 và 2, cũng như dấu rúp Nga | 123 | 113.021 |
8.0 | 6/2015 | ISBN 978-1-936213-10-8 | ISO/IEC 10646:2014 cùng với tu chính án 1, dấu Lari Gruzia, chín CJK unified ideographs và 41 emoji | 129 | 120.672 |
9.0 | 6/2016 | ISBN 978-1-936213-13-9 | ISO/IEC 10646:2014 cùng với tu chính án 1 và 2, chữ Adlam, chữ Newa, Japanese TV symbols và 74 emoji | 135 | 128.712 |
10.0 | 6/2017 | ISBN 978-1-936213-16-0 | ISO/IEC 10646:2017 | 139 | 136.690 |
11.0 | 6/2018 | ISBN 978-1-936213-19-1 | ISO/IEC 10646:2017 plus Amendment 1, as well as 46 Mtavruli Georgian capital letters, 5 CJK unified ideographs, and 66 emoji characters. | 146 | 137,374 |
12.0 | 3/2019 | ISBN 978-1-936213-22-1 | ISO= ISO/IEC 10646:2017 plus Amendments 1 and 2, as well as 62 additional characters. | 150 | 137,928 |
12.1 | 5/2019 | ISBN 978-1-936213-25-2 | 150 | 137,929 | |
13.0 | 3/2020 | ISBN 978-1-936213-26-9 | ISO= ISO/IEC 10646:2020 | 154 | 143,859 |
14.0 | 9/2021 | ISBN 978-1-936213-29-0 | 159 | 144,697 |
Liên kết hữu ích
- Liên Đoàn Unicode
- Các phiên bản Unicode: 3.1, 3.2, 4.0
- DecodeUnicode - Wiki Unicode, 50.000 hình ảnh GIF và thông tin về từng ký tự
- Tài nguyên Unicode của Alan Wood (chứa danh sách các công cụ xử lý từ hỗ trợ Unicode)
- Bảng mã Unicode (PDF)
- Bảng mã UTF-8, UTF-16, UTF-32 Lưu trữ ngày 2005-07-28 tại Wayback Machine
- Cơ sở dữ liệu chữ cái
- Dự án UTF-8, phổ biến hỗ trợ Unicode trong phần mềm mã nguồn mở Lưu trữ ngày 2002-03-31 tại Wayback Machine
- FAQ về Unicode tiếng Việt
Các bản mẫu Unicode | |
---|---|
| |
| |
| |
| |
| |
| |
|
Tiêu đề chuẩn |
|
---|