Bộ mã Unicode dụng bao nhiêu byte để mã hóa 1 ký tự

Unicode và Bộ ký tự

Tổng quan ngắn gọn về hệ thống Unicode, UTF, ASCII và mã hóa

Ảnh của Kelvin Yan trên Unsplash

Máy tính có ngôn ngữ riêng. Họ không hiểu ngôn ngữ của con người (có thể họ hiểu nếu bạn nói hệ nhị phân), và họ không biết gì ngoài hệ nhị phân. Làm thế nào để chúng ta giao tiếp với họ?

Khi tôi đang gõ, máy tính không nhận biết được bất kỳ ký tự nào bạn đang thấy. Hãy xem xét ký tự M. Ở cấp độ thấp nhất, M được lưu trữ sử dụng một chuỗi các 0s và 1s: 01001101. Trước khi tiếp tục, hãy nhớ lại hai định nghĩa cơ bản:

Bit - đơn vị lưu trữ nhỏ nhất, chỉ có thể lưu trữ 0 hoặc 1
Byte - một byte = tám bit. Đó là nó.

Unicode

Tiêu chuẩn Unicode :

Tiêu chuẩn Unicode là một hệ thống mã hóa ký tự được thiết kế để hỗ trợ việc trao đổi, xử lý và hiển thị trên toàn thế giới các văn bản viết bằng các ngôn ngữ và kỹ thuật đa dạng của thế giới hiện đại. Ngoài ra, nó hỗ trợ các văn bản cổ điển và lịch sử của nhiều ngôn ngữ viết .

Nói một cách dễ hiểu, Unicode gán cho mỗi ký tự một số duy nhất (được gọi là điểm mã), bất kể nền tảng, chương trình hay bất kỳ thứ gì khác.

Bộ ký tự

Bộ ký tự là một tập hợp cố định của các ký hiệu. Ví dụ, từ أ đến ي là một bộ ký tự đại diện cho bảng chữ cái Ả Rập.

Một ví dụ khác là bảng ASCII nổi tiếng: một mã ký tự bảy bit trong đó mỗi chuỗi đại diện cho một ký tự duy nhất. ASCII có thể đại diện cho 27 (= 128) ký tự (bao gồm cả ký tự không in được), nhưng đáng buồn là nó không thể đại diện cho tình yêu , bảng chữ cái tiếng Do Thái, tiếng Nga, tiếng Ả Rập và các ký tự hữu ích hơn. Nhưng tại sao?

Vì bất kỳ tệp nào cũng phải trải qua quá trình mã hóa / giải mã để được lưu trữ đúng cách, máy tính của bạn cần biết cách dịch bộ ký tự của hệ thống viết ngôn ngữ của bạn thành các chuỗi 0 và 1. Quá trình này được gọi là mã hóa ký tự. Bạn có thể nghĩ về nó như một cái bàn. Để cung cấp cho bạn trực giác về bảng có nghĩa là gì, hãy xem hình ảnh dưới đây:

Bảng ASCII

Ký tự A được biểu thị bằng giá trị thập phân 65 (là 1000001 trong hệ nhị phân bảy bit). Vì vậy, bây giờ câu hỏi là, làm thế nào để chúng ta đại diện cho các ký tự nằm ngoài phạm vi này?

Hệ thống mã hóa

Điều rất quan trọng là phải phân biệt giữa bộ ký tự và khái niệm hệ thống mã hóa . Kiểu đầu tiên chỉ đơn giản là một tập hợp các ký tự bạn có thể sử dụng, trong khi kiểu sau là cách những ký tự này được lưu trữ trong bộ nhớ (dưới dạng một dòng byte), vì vậy có thể có nhiều hơn một mã hóa cho một bộ ký tự nhất định.

Cũng giống như lược đồ ASCII, có nhiều hệ thống mã hóa khác:

  • UTF-8
  • UTF-16
  • UTF-32
  • EUC

UTF-32

Lược đồ này yêu cầu 32 bit (bốn byte) để mã hóa bất kỳ ký tự nào. Ví dụ: để biểu diễn điểm mã ký tự A bằng cách sử dụng lược đồ này, chúng tôi sẽ cần viết 65 ở dạng số nhị phân 32 bit:

00000000 00000000 00000000 01000001

Lược đồ này không tốt cho người nói tiếng Anh, bởi vì bây giờ các tệp chỉ chứa các ký tự ASCII, chẳng hạn có tổng kích thước X byte, sẽ biến thành những con quái vật có kích thước gấp bốn lần byte, điều này gây lãng phí bộ nhớ.

UTF-16 (+ LE & BE)

Một giải pháp khác ở dạng UTF-16 đã được đưa ra. Bạn có thể nghĩ rằng giống như UTF-32 sử dụng 32 bit có chiều rộng cố định để biểu diễn một điểm mã, UTF-16 là 16 bit có chiều rộng cố định. Sai lầm!

Trong UTF-16, điểm mã có thể được biểu diễn bằng 16 bit hoặc 32 bit . Vì vậy, lược đồ này là một hệ thống mã hóa có độ dài thay đổi . Ưu điểm so với UTF-32 là gì? Ít nhất đối với ASCII, kích thước của tệp sẽ không gấp bốn lần so với ban đầu (nhưng vẫn là gấp đôi), vì vậy chúng tôi vẫn chưa tương thích ngược ASCII.

Vì bảy bit là đủ để đại diện cho ký tự A , giờ đây chúng ta có thể sử dụng hai byte thay vì bốn như UTF-32.

00000000 01000001 01000001 00000000 int *p; p = (int *) malloc(8 * sizeof(int)); +---+---+ | 0 | A | +---+---+ +---+---+ | A | 0 | +---+---+

UTF-8

Bạn đoán đúng: Trong UTF-8, điểm mã có thể được biểu diễn bằng cách sử dụng 32 , 16 , 24 hoặc tám bit và là hệ thống UTF-16, điểm mã này cũng là hệ thống mã hóa có độ dài thay đổi.

Cuối cùng, chúng ta có thể biểu diễn A giống như cách chúng ta biểu diễn nó bằng cách sử dụng hệ thống mã hóa ASCII:

01001101

Mở trình soạn thảo văn bản yêu thích của bạn (Vim) và tạo một tệp có chứa ký tự A. Hãy xem bảng mã của nó:

$ xxd -b test.txt 0000000: 0100001 00001010 $ du -b test.txt | cut -f1 2 $ file test.txt test.txt: UTF-8 Unicode text $ du -b test.txt | cut -f1 3 $ xxd -b test.txt 0000000: 11001110 10110100 00001010 11001110 10110100 11001110 10110100

UTF-8 so với UTF-16

Cả UTF-8 và UTF-16 đều là mã hóa có độ dài thay đổi. Mã hóa UTF-8 có thể chiếm tối thiểu tám bit, trong khi yêu cầu tối thiểu 16 bit cho UTF-16.

Đối với các ký tự ASCII cơ bản, UTF-8 sẽ chỉ sử dụng một byte cho mỗi ký tự, trong khi mã hóa UTF-16 sẽ sử dụng hai byte (điều này làm cho UTF-8 tương thích ngược với ASCII).

Bây giờ chúng ta hãy nói về các trường hợp mã hóa UTF-8 chiếm nhiều byte hơn UTF-16. Hãy xem xét chữ cái Trung Quốc 語 - mã hóa UTF-8 của nó là:

11101000 10101010 10011110 10001010 10011110

Video liên quan

Chủ đề