Như chúng ta đã biết, tiếng Anh là một ngôn ngữ thông dụng và được chúng ta tận dụng qua bảng mã ASCII. Vậy với các ngôn ngữ khác có các ký tự đặc biệt thì sao, UTF-16, UTF-8 là bộ mã hóa ký tự dành cho Unicode là một chuẩn chung cho ngôn ngữ quốc tế, nhưng ưu điểm hơn UTF-16 là khả năng tương thích ngược với ASCII.
Data Structure & Algorithm Cryptography & Security C/C++ La Kiến Vinh 2015-09-17 14:00:15

Giới thiệu

Tiếng Anh là một ngôn ngữ thông dụng và được chúng ta tận dụng qua bảng mã ASCII. Vậy với các ngôn ngữ khác có các ký tự đặc biệt thì sao, UTF-16, UTF-8 (UTF16, UTF8) là bộ mã hóa ký tự dành cho Unicode là một chuẩn chung cho ngôn ngữ quốc tế, nhưng ưu điểm hơn UTF-16 là khả năng tương thích ngược với ASCII.

Bài viết liên quan

UTF-8

Mã hóa

Giả sử U là giá trị của ký tự cần được mã hoá (giá trị này được quy định theo chuẩn ISO 10646), giá trị này không vượt quá 0x10FFFF. Các bước để mã hoá ký tự trên như sau:

  • Nếu U < 0x007F, mã hoá U bằng 1 byte với dạng 0xxxxxxx.
  • Nếu U trong khoảng 0x0080 và 0x07FF, mã hóa U bằng 2 bytes: byte đầu tiên dạng 110xxxxx, byte thứ 2 dạng 10xxxxxx.
  • Nếu U trong khoảng 0x0800 và 0xFFFF, mã hóa U bằng 3 bytes: byte đầu tiên dạng 1110xxxx, byte thứ 2 và 3 dạng 10xxxxxx.
  • Nếu U trong khoảng 0x10000 và 0x10FFFF, mã hóa U bằng 4 bytes: byte đầu tiên dạng 11110xxx, 3 bytes cuối dạng 10xxxxxx.

Giải mã

Về giải mã, ta làm ngược lại với phương pháp mã hóa.

  • Nếu byte đang xét có dạng 0xxx xxxx thì U đang được mã hóa 1 byte 0xxx xxxx.
  • Nếu byte đang xét có dạng 110x xxxx thì U đang được mã hóa 2 bytes 110x xxxx 10xx xxxx.
  • Nếu byte đang xét có dạng 1110 xxxx thì U đang được mã hóa 3 bytes 1110 xxxx 10xx xxxx 10xx xxxx.
  • Nếu byte đang xét có dạng 1111 0xxx thì U đang được mã hóa 4 bytes 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx.

* Với xxx... là dữ liệu chứa giá trị của U.

Ví dụ về mã hóa và giải mã

  • S - mã hóa 1 byte
  • © - mã hóa 2 bytes
  • 中 - mã hóa 3 bytes
  • ? - mã hóa 4 bytes
BIỂU
TƯỢNG
GIÁ TRỊ THẬP PHÂN GIÁ TRỊ NHỊ PHÂN GIÁ TRỊ NHỊ PHÂN ĐÃ MÃ HÓA
S 83 < 0x007F (127) 0101 0011 0101 0011
© 0x0080 (128) <= 169 <= 0x07FF (2047) 000 1010 1001 1100 0010 1010 1001
0x0800 (2048) <= 20013 <= 0xFFFF (65535) 0100 1110 0010 1101‬ 1110 0100 1011 1000 1010 1101
? 0x10000 (65536) <= 66377 <= 0x10FFFF (‭1114111‬) 0 0001 0000 0011 0100 1001 1111 0000 1001 0000 1000 1101 1000 1001