Unicode không được thiết kế để giải quyết toàn bộ vấn đề có nhiều bảng mã khác nhau.
Unicode được thiết kế để giải quyết toàn bộ vấn đề về một số đại diện cho nhiều thứ khác nhau tùy thuộc vào trang mã được sử dụng. Các số 0 - 127 đại diện cho các ký tự giống nhau trong bất kỳ trang mã Ansi nào. Đây là những gì còn được gọi là biểu đồ hoặc bộ ký tự ASCII. Trong các trang mã Ansi, cho phép 256 ký tự, các số 128 - 255 thể hiện các ký tự khác nhau trong các trang mã khác nhau.
Ví dụ
- Số $ 57 đại diện cho chữ W viết hoa trong tất cả các trang mã, nhưng
- Số $ EC đại diện cho biểu tượng không có giá trị trong trang mã 437 (Hoa Kỳ), nhưng "LATIN SMALL LETTER N VỚI CEDILLA" trong mã trang 775 (Baltic)
- Dấu hiệu Cent là số $ 9B trong mã trang 437, nhưng số 96 trong mã trang 775
Những gì Unicode đã làm, đã đảo ngược tất cả. Trong Unicode không có "tái sử dụng". Mỗi số đại diện cho một ký tự duy nhất. Số $ 00A2 bằng Unicode là ký hiệu cent và ký hiệu cent xuất hiện không ở đâu khác trong định nghĩa Unicode.
Tại sao sau đó có rất nhiều bảng mã Unicode? Ngay cả nhiều phiên bản của (về cơ bản) cùng một phiên bản, như UTF-8, UTF-16, v.v.
Không có nhiều phiên bản của cùng một mã hóa. Có nhiều bảng mã của cùng một bản đồ định nghĩa ký tự Unicode và chúng đã được "phát minh" để quản lý các yêu cầu lưu trữ cho các cách sử dụng khác nhau của các mặt phẳng ngôn ngữ khác nhau tồn tại trong Unicode.
Unicode định nghĩa (hoặc có không gian để xác định) 4.294.967.295 ký tự duy nhất. Nếu bạn muốn ánh xạ những thứ này vào bộ nhớ đĩa / bộ nhớ mà không thực hiện bất kỳ chuyển đổi thuật toán nào, bạn cần 4 byte cho mỗi ký tự. Nếu bạn cần lưu trữ văn bản với các ký tự từ tất cả các mặt phẳng ngôn ngữ, thì UTF-32 (về cơ bản là ký tự 1 ký tự - mã hóa lưu trữ 4 byte của định nghĩa unicode) có lẽ là thứ bạn cần.
Nhưng hầu như không có văn bản nào sử dụng các ký tự từ tất cả các mặt phẳng ngôn ngữ. Và sau đó sử dụng 4 byte cho mỗi ký tự có vẻ là một sự lãng phí lớn. Đặc biệt là khi bạn tính đến việc hầu hết các ngôn ngữ trên trái đất được xác định trong phạm vi được gọi là Mặt phẳng đa ngôn ngữ cơ bản (BMP): 65536 số đầu tiên của định nghĩa Unicode.
Và đó là nơi UTF-16 xuất hiện. Nếu bạn chỉ sử dụng các ký tự từ BMP, UTF-16 sẽ lưu trữ rất hiệu quả khi chỉ sử dụng hai byte cho mỗi ký tự. Nó sẽ chỉ sử dụng nhiều byte hơn cho các ký tự bên ngoài BMP. Sự khác biệt giữa UTF-16LE (Little Endian) và UTF-16BE (Big Endian) thực sự chỉ liên quan đến cách các số được biểu thị trong bộ nhớ máy tính (mẫu byte A0
có nghĩa là hex $ A0 hoặc có nghĩa là $ 0A).
Nếu văn bản của bạn sử dụng ít ký tự khác nhau hơn, như hầu hết các văn bản trong các ngôn ngữ Tây Âu, bạn sẽ muốn hạn chế các yêu cầu lưu trữ cho văn bản của mình hơn nữa. Do đó UTF-8, sử dụng một byte đơn để lưu trữ các ký tự có trong biểu đồ ASCII (128 số đầu tiên) và lựa chọn từ các ký tự Ansi (128 số thứ hai của các trang mã khác nhau). Nó sẽ chỉ sử dụng nhiều byte hơn cho các ký tự bên ngoài bộ "ký tự được sử dụng nhiều nhất" này.
Vì vậy, để tóm tắt lại:
- Unicode là ánh xạ các ký tự trong tất cả các ngôn ngữ trên trái đất (và một số Klingon để khởi động) và sau đó một số (toán học, âm nhạc, v.v.) thành một số duy nhất.
- Mã hóa là các thuật toán được xác định để lưu trữ văn bản bằng cách sử dụng số của bản đồ ký tự duy nhất này một cách hiệu quả nhất có thể với "mức sử dụng trung bình" của các ký tự trong văn bản.