Mở đầu

Máy tính chỉ làm việc với các bit 01 (hay chính xác hơn là các trạng thái ON/OFF của transitor trong bo mạch), lưu dữ liệu lên bộ nhớ, đọc dữ liệu, truyền dữ liệu, tất cả đều thao tác với các bit 0 1.

Để có thể lưu trữ được dữ liệu lên bộ nhớ, cần một phương pháp để chuyển từ các chữ cái, ký tự,... sang bit 0 1, phương pháp được nhắc tới đó được gọi là encode, và việc mã hóa một ký tự sang các bit được gọi là character encoding.

 

Character Encoding

 character encoding là việc mapping từ chữ cái, chữ số, ký hiệu,...(character) sang mã binary (byte code).

Việc mapping này được nhiên cần tới 2 tập hợp để thực hiện, tập các characters (tập A) và tập các byte codes (tập B): A  B

 

Tập characters A

Ví dụ bảng mã ASCII có 128 ký tự (tập A gồm 128 phần tử) thì phải mô tả 128 ký tự này trên máy tính để thực hiện việc mapping.

Lúc này 128 ký tự này sẽ được đánh số thứ tự từ 0 -> 127 để phân biệt. Để lưu trữ số thứ tự từ 0 -> 127 này lên máy tính ta phải lưu trữ dưới dạng binary của máy tính là 0x00 -> 0x7F (lưu ý là chúng ta chưa bàn tới tập B).

 

Code points

Code points chính là đơn vị của mỗi phần tử trong tập A.

Tập A ở trên có 128 phần tử tương đương với 128 code points.

 

Tập byte codes B

Là tập hợp được chuẩn hóa từ tập A nói ở trên. Tập A nói ở trên được đánh dấu trong bộ nhớ từ 0x00 -> 0x7F nhưng tập B này được đánh giá trị sẽ có thể khác về giá trị và về dung lượng byte cho mỗi ký tự. Việc khác thế nào là tùy thuộc vào loại loại encoding (UTF8, UTF16,…)

Các khái niệm về UTF8, UTF16, Unicode và cách mã hóa xem ở bài viết này.

Ở ví dụ trên ta giả sự tập AASCII thì sẽ có 128 ký tự, ngoài ra còn nhiều bảng mã khác như Unicode là tập hợp tất cả những ký tự và chữ cái trên thế giới.

 

Unicode

Tính đến thời điểm 6/2018, Unicode 11.0 có tổng cộng 137.439 ký tự, nhưng không gian chứa của Unicode có thể lên tới khoảng 1.114.112 ký tự được biểu diễn từ 000000 -> 10FFFF (mã hex).

 

(000000  10FFFF)hex:

  • (00  10)hex = (0000 0000  00001 0000)bin  = (0  16)dec           (17 số biểu diễn)
  • (0000  FFFF)hex = (0000 0000 0000 0000  1111 1111 1111 1111)hex = (0  65535)dec            (65.536 số biểu diễn)

=> Unicode có không gian chứa là 17x216 = 17x65.536 = 1.114.112 code points, Unicode được chia ra làm 17 planes.

Plane thứ nhất là plane cơ bản tập hợp các code points biểu diễn được hầu hết các ngôn ngữ hiện đại trên thế giới và các ký hiệu trên thế giới, plane này được ký hiệu là BMP (Basic Multilingual Plane).

 

Khi bạn mở một file và thấy dữ liệu hiển thị không đúng do chọn sai loại encode để giải mã, bạn chỉ cần chọn lại loại encode cho đúng là được, dữ liệu đang được lưu trữ trên bộ nhớ dưới dạng byte không hề bị thay đổi trừ khi bạn save lại.