Giới thiệu về mã hóa ký tự

(Nguồn: unsplash.com)

Các mã hóa theo định nghĩa là một cách để chuyển đổi dữ liệu từ một định dạng khác. Khi chúng ta có một số văn bản ( chuỗi ký tự ) và chúng ta muốn lưu trữ nó bên trong máy tính ( máy ) hoặc chuyển qua mạng kỹ thuật số, chúng ta cần chuyển nó sang biểu diễn nhị phân vì đó là ngôn ngữ duy nhất mà máy tính dựa trên hệ nhị phân có thể hiểu được .

Một mã hóa ký tự là một cách để chuyển đổi dữ liệu văn bản sang số nhị phân. Tóm lại, chúng ta có thể gán các giá trị số duy nhất cho các ký tự cụ thể và chuyển đổi các số đó bằng ngôn ngữ nhị phân. Các số nhị phân này sau đó có thể được chuyển đổi trở lại các ký tự gốc dựa trên các giá trị của chúng.

Trước khi khởi đầu, tất cả chúng ta hãy hiểu một vài thuật ngữ trước .

Biểu diễn nhị phân sang thập lục phân

Các hệ thống số nhị phân là rất giống với hệ thống số thập phân nhưng chúng tôi chỉ có 0 một 1 để đại diện cho một số. Đây video trên YouTube giải thích cách chúng tôi có thể chuyển đổi số thập phân sang số nhị phân. Bạn cũng có thể chuyển đổi một số nhị phân sang số thập phân, hãy làm theo hướng dẫn này .

Hệ thống số thập lục phân cũng tương tự như hệ thống số thập phân nhưng chúng ta có 16 ký tự để chơi với, từ 0-9AF. Để chuyển một số nhị phân sang số thập lục phân, chúng ta cần lấy giá trị thập phân của số nhị phân và chuyển nó sang số thập lục phân. Làm theo hướng dẫn bằng video này để hiểu chuyển đổi từ thập phân sang thập lục phân.

Tóm lại, số thập lục phân có cơ số là 16. Điều này có nghĩa là một ký tự duy nhất của hệ thống số thập lục phân là đủ để biểu thị các giá trị từ 0–15. Tương tự, trong hệ thống số thập phân ( cơ số 10 ), một ký tự đơn có thể đại diện cho một giá trị từ 0–9 trong khi trong hệ thống số nhị phân ( cơ số 2 ), một ký tự duy nhất có thể đại diện cho một giá trị từ 0–1 .

Vì một ký tự duy nhất của hệ thập lục phân đại diện cho giá trị từ 0 đến 15 và tương tự, số 4 bit nhị phân giữ giá trị từ 0 đến 15, chúng ta có thể sử dụng chúng thay thế cho nhau.

Số nhị phân 1101 0011( thập phân211 ) trong hệ thập lục phân được biểu diễn dưới dạng D3. Điều này là do giá trị 110113trong thập phân ( Dtrong hệ thập lục phân ) và giá trị của 00113 trong số thập phân ( 3trong hệ thập lục phân ). Nếu chúng ta chuyển đổi D3sang số thập phân bằng công thức đơn giản (13 x 16¹ + 3 x 16⁰), chúng ta nhận được 211giá trị của số nhị phân 11010011.

MSB và LSB

Các MSB ( viết tắt từ Hầu hết ý nghĩa Bit ) là bit trái nhất của một số nhị phân. Chúng tôi gọi nó là MSB hoặc quan trọng nhất vì nó có đóng góp lớn nhất cho số nhị phân .

Ví dụ: trong số nhị phân, bit ngoài cùng bên trái là MSB, vì nó quảng cáo giá trị cho số nhị phân, tuy nhiên, bit ngoài cùng bên phải là LSB ( Bit ít quan trọng nhất ), vì nó quảng cáo giá trị 2⁰ cho Số nhị phân.001101

MSB cũng có thể được sử dụng như một từ viết tắt của Most Significant Byte và tương tự, LSB cũng có thể được sử dụng như một từ viết tắt của Least Significant Byte. Nếu một số nhị phân được biểu diễn dưới dạng bội số của 8 bit ( byte ), byte ngoài cùng bên trái là MSB và byte ngoài cùng bên phải là LSB.

💡 Bạn có thể tìm hiểu sâu hơn về MSB và LSB từ bài viết wiki này.

Sức bền

Có nhiều cách khác nhau mà hệ thống máy tính có thể lưu trữ một số nhiều byte. Ví dụ: số thập phân 9,905,798 trong hệ nhị phân sẽ như thế nào 10010111 00100110 10000110và trong biểu diễn hex là 97 26 86.

Như chúng ta biết máy tính lưu trữ dữ liệu theo một chuỗi byte. Đối với số của chúng tôi, chúng tôi cần 3 byte nhưng nếu số này phải được biểu diễn dưới dạng số nguyên 32 bit (4 byte), chúng tôi cần thêm một byte rỗng vào đầu.

Do đó, số của chúng ta trong biểu diễn hex 32-bit trở thành 00 97 26 86. Các MSB trong trường hợp này là 00LSB86.

Các endianness của một hệ thống máy tính là cách nó lưu trữ một số lượng đa byte. Một hệ thống được gọi là big-endian khi nó lưu trữ MSB trước ( từ big end ). Do đó, một hệ thống big-endian sẽ lưu trữ 00ở địa chỉ bộ nhớ thấp nhất ( đầu tiên ) và 86ở địa chỉ bộ nhớ cao nhất ( cuối cùng ).

Do đó, trong một mạng lưới hệ thống big-endian, số của tất cả chúng ta được lưu trong bộ nhớ như bên dưới .

MSB                        LSB
00       97       26       86
0x00     0x01     0x02     0x03      <- memory address

Do đó, trong một mạng lưới hệ thống endian nhỏ, số của tất cả chúng ta được tàng trữ trong bộ nhớ như bên dưới .

LSB                        MSB
86       26       97       00
0x00     0x01     0x02     0x03      <- memory address

💡 Hầu hết các hệ thống máy tính hiện đại sử dụng định dạng little-endian để lưu trữ dữ liệu trong bộ nhớ. Bạn có thể theo dõi chủ đề này để hiểu so sánh của họ.

Bộ ký tự

Bộ ký tự hay đơn giản là bảng mã là một bảng các số duy nhất được gán cho các ký tự khác nhau như chữ cái, số và các ký hiệu khác. Có nhiều ký tự được đặt như ASCII, UTF, ISO và các ký tự khác. Ví dụ, giá trị của ký tự A trong bộ ký tự ASCII là 65 ( thập phân ).

Lược đồ mã hóa

Một lược đồ mã hóa hay đơn giản là mã hóa là một cách để biểu diễn một ký tự trong hệ nhị phân. Bảng mã phải tuân theo một bộ ký tự cụ thể. Ví dụ: mã hóa UTF-8 tuân theo bộ ký tự UTF. Nó sử dụng số nhị phân 8 bit để biểu diễn một ký tự.

Kể từ khi giá trị của nhân vật Một trong UTF bộ ký tự là chữ số thập phân 65 (hoặc thập lục phân 41 ), mã UTF-8 mã hóa kí tự A đến 01000001đó là tương đương nhị phân của giá trị thập phân 65 .

Điểm mã

Điểm là một giá trị thập phân được liên kết với một ký tự trong bộ ký tự. Ví dụ: điểm mã của ký tự A trong bộ mã UTF65 .

Mã hóa ASCII

ASCII ( viết tắt của American Standard Code for Information Interchange ) là một bảng mãbảng mã được phát triển bởi ASA vào những năm 1960. Bảng mã này chủ yếu được phát triển cho truyền thông điện tử ở Hoa Kỳ. Do đó, nó chỉ mã hóa các ký tự tiếng Anh, số và các ký hiệu khác thường được sử dụng ở Hoa Kỳ và trong các hệ thống kỹ thuật số của Hoa Kỳ.

Bộ ký tự ASCII chứa tổng cộng 128 ký tự và mỗi ký tự có một giá trị duy nhất từ 0 đến 127. Do đó, số nhị phân 7 bit đủ để đại diện cho một ký tự từ bộ mã ASCII vì số nhị phân 7 bit có thể chứa các giá trị từ 0 đến 127 ( tổng số 128 giá trị duy nhất → ²⁷ ).

💡 Các bit chiều rộng hoặc bit chiều dàichiều dài của số nhị phân được sử dụng bởi một chương trình mã hóa để đại diện cho một ký tự. Do đó trong ASCII, độ rộng bit là 7 .

Tuy nhiên, trong một hệ thống máy tính điển hình, bộ nhớ được tạo bởi các ô đơn vị và mỗi ô riêng lẻ chứa 8 bit ( byte ). Do đó, mặc dù ASCII chỉ cần 7 bit để mã hóa một ký tự, nó được lưu trữ dưới dạng 8 bit bằng cách giữ bit 0 đầu tiên ( MSB ). Do đó, độ rộng bit thực tế của ASCII là 8 .

💡 Vì bit đầu tiên của ký tự ASCII luôn là 0 nên nó còn được gọi là bit chết vì nó không có ý nghĩa hoặc công dụng.

Bạn có thể theo dõi bảng này để xem mã điểm của các ký tự trong bảng mã ASCII. Từ bảng này, giá trị của các ký tự trong HELLOvăn bản trong biểu diễn thập lục phân là 48 45 4C 4C 4F.

Bạn có thể sử dụng công cụ trực tuyến này để chuyển đổi chuỗi byte thập lục phân sang văn bản ASCII. Sử dụng công cụ này, 48 45 4C 4C 4Ftrong ASCII là…

https://www.rapidtables.com/convert/number/hex-to-ascii.html

Ví dụ

  • 0 1000001 → 41₁₆ → 65₁₀ → A
  • 0 1100001 → 61₁₆ → 91₁₀ → a
  • 0 0100000 → 20₁₆ → 32₁₀ → (dấu cách )
  • 0 0111001 → 39₁₆ → 57₁₀ → 9
  • 0 1000000 → 40₁₆ → 64₁₀ → @

ASCII là một trong những lược đồ mã hóa đơn giản nhất từng được phát triển. Vì nó chỉ sử dụng một byte cho mỗi ký tự, thông thường kích thước tệp văn bản hoặc trọng tải mạng là nhỏ so với các bảng mã khác.

ASCII là mã hóađộ rộng cố định có nghĩa là độ rộng bit được sử dụng bởi một ký tự là cố định và nó là 8 đối với mã hóa ASCII. Bằng cách này, một chương trình đọc văn bản được mã hóa ASCII không phải mất nhiều thời gian để đoán độ rộng bit của một ký tự. Điều này làm cho văn bản ASCII dễ đọc và viết hơn.

Cho đến thời nay, những website hoàn toàn có thể vẫn được ship hàng bằng cách sử dụng mã hóa ASCII. Tuy nhiên, bảng mã ASCII chỉ chứa những ký tự tiếng Anh và bảng mã này chỉ hoàn toàn có thể được sử dụng để luân chuyển tài liệu ngôn từ tiếng Anh .

Mã hóa ASCII mở rộng

Vì ASCII chỉ sử dụng 7 bit để mã hóa một ký tự nhưng sử dụng 8 bit bộ nhớ để lưu trữ một ký tự nên MSB luôn không được sử dụng. Nếu một mã hóa sử dụng bit chết này, chúng tôi có thể thêm 128 ký tự mới vào bộ ký tự ASCII mà không làm tăng kích thước tệp hoặc tải trọng mạng .

Mã hóa như vậy được gọi là mã hóa ASCII mở rộng. Có nhiều bảng mã bổ sung cho bộ ký tự ASCII. Một trong những tiêu chuẩn phổ biến nhất là ISO 8859–1 bổ sung 128 ký tự mới vào bộ ký tự.

Một bảng mã ASCII mở rộng phổ biến khác là Mã trang 437, còn được gọi là DOS Mỹ Latinh. Bạn có thể thấy các ký tự mới ngoài mã điểm 127 từ bảng này. Tuy nhiên, kiểu mã hóa này chủ yếu được sử dụng trong máy tính IBM.

💡 Bạn có thể tìm hiểu thêm về mã hóa ASCII từ bài viết wiki này .

ISO / IEC 8859–1

Mặc dù ASCII là một trong những lược đồ mã hóa phổ biến, nhưng nó thiếu hỗ trợ cho các ký tự trong các ngôn ngữ khác. Do đó, ISOIEC đã cùng nhau tạo ra một loạt các tiêu chuẩn được gọi là ISO / IEC 8859 cho mã hóa ký tự 8 bit .

ISO 8859–1 là một phần mở rộng cho mã hóa ASCII giới thiệu 128 ký tự mới bằng cách sử dụng bit chết của điểm mã ASCII. Phần bổ sung ký tự mới này chứa 96 ký tự in được và 32 ký tự điều khiển.

Bảng mã này chủ yếu được tạo ra để hỗ trợ Bảng chữ cái Latinh được sử dụng trong các ngôn ngữ khác nhau ở Châu Âu, do đó nó còn được gọi là ISO Latinh 1. Bộ ký tự ISO 8859–1 chứa tất cả các ký tự được sử dụng trong các ngôn ngữ tiếng Anh, tiếng Tây Ban Nha, tiếng Thụy Điển, tiếng Ý, v.v. tuy nhiên các ngôn ngữ như tiếng Hà Lan, tiếng Đức, tiếng Pháp, v.v. có phạm vi bao phủ không đầy đủ.

💡 Đọc thêm về thông tin về phạm vi áp dụng của ISO 8859–1 và cách một ngôn ngữ có phạm vi áp dụng chưa hoàn chỉnh đưa ra giải pháp.

Theo bài viết trên wiki này, ISO 8859–1 là mã hóa mặc định của tài liệu được phân phối qua HTTP với Kiểu MIME bắt đầu bằng text/. Điều này đã được thay đổi trong HTML5 thành UTF-8. Cho đến ngày nay, một số giá trị tiêu đề HTTP vẫn được mã hóa bằng mã hóa ISO 8859–1.

💡 Bạn có thể theo dõi bài viết này để biết bộ ký tự của mã hóa ISO 8859–1.

Ví dụ

  • 0 1000001 → 41₁₆ → 65₁₀ → A
  • 0 1100001 → 61₁₆ → 91₁₀ → a
  • 1 0101001 → A9₁₆ → 169₁₀ → ©
  • 1 0111101 → BD₁₆ → 189₁₀ → ½
  • 1 1110101 → F5₁₆ → 245₁₀ → õ

Do đó, một tệp / dữ liệu được mã hóa ASCII có thể được đọc bởi bộ giải mã ISO 8859–1. Tuy nhiên, một tệp được mã hóa ISO 8859–1 sẽ không được bộ giải mã ASCII phân tích cú pháp thành công nếu các điểm mã của các ký tự vượt quá 127 .

Ưu và nhược điểm

Giống như ASCII, ISO 8859–1 cũng là một lược đồ mã hóa có độ rộng cố định với độ rộng bit là 8. ISO 8859–1 có thêm 96 ký tự từ Bộ ký tự Latinh bao gồm hầu hết các ngôn ngữ châu Âu.

Tuy nhiên, mặc dầu trình làng những ký tự mới, nó không xử lý được yếu tố cho tổng thể những ngôn từ. Thậm chí, 1 số ít ngôn từ châu Âu vẫn chưa được tương hỗ vừa đủ. ISO 8859 – 1 chắc như đinh không hề được sử dụng cho những ngôn từ không phải tiếng Latinh .

Bảng mã Unicode Consortium và UTF

Nếu chúng ta nghĩ về mã hóa độ rộng cố định 8 bit, chúng ta chỉ có 8 bit để biểu diễn một ký tự. Do đó, tối đa 256 ký tự có thể được biểu diễn bằng cách mã hóa như vậy.

Nhưng trong thế giới mà chúng ta đang sống, chúng ta có nhiều ngôn ngữ và mỗi ngôn ngữ có nhiều ký tự và ký hiệu, chưa nói đến ngôn ngữ Trung Quốc có hơn 5.000 ký tự. Mã hóa chiều rộng cố định 8 bit chắc chắn là không đủ.

Vì thế giới ngày càng trở nên kết nối với nhau hơn với sự phát minh ra internetweb trên toàn thế giới, chúng ta cần một bộ ký tự và mã hóa được chấp nhận rộng rãi có thể đại diện cho tất cả các ký tự từng tồn tại trên hành tinh này với mong muốn có các ký tự mới.

Các Unicode Consortium là một tổ chức phi lợi nhuận duy trì Unicode chuẩn. Unicode duy trì Bộ ký tự Unicode được gọi đơn giản là Unicode (viết tắt của Bộ ký tự được mã hóa phổ thông ).

Các Unicode Consortium cũng duy trì các tiêu chuẩn cho UTF mã hóa. UTF ( từ viết tắt của Unicode Transformation Format ) là một tập hợp các lược đồ mã hóa dựa trên bảng mã Unicode .

⦿ - - - - ⦿

Mã hóa UCS

Trước khi thành lập Unicode Consortium, công việc trước đó đã bắt đầu với tiêu chuẩn ISO / IEC 10646 xác định các lược đồ mã hóa độ rộng cố định 16 bit32 bit để hỗ trợ các ký tự từ các ngôn ngữ cơ bản được sử dụng trên khắp thế giới. UCS là từ viết tắt của Universal Coded Character Set .

Họ đã đưa ra các lược đồ mã hóa UCS-2UCS-4. Tuy nhiên, các lược đồ mã hóa này hiện đã lỗi thời và các mã hóa UTF phù hợp hơn hiện được hỗ trợ khả năng tương thích ngược với các mã hóa này.

Theo bài viết Wikipedia này …
Tiêu chuẩn ISO / IEC 10646 này được duy trì cùng với Tiêu chuẩn Unicode ( “ Unicode ” ) và chúng giống nhau về mã so với mã .

UCS-2

UCS-2 là mã hóa độ rộng cố định 16 bit ( 2 byte ), có nghĩa là 16 bit sẽ được sử dụng để mã hóa một ký tự. Vì một ký tự chiếm 2 byte bộ nhớ nên 65.536 ký tự (²¹⁶) ký tự có thể được biểu thị bằng mã hóa UCS-2.

Bảng mã này giống với bảng mã UTF-16 nhưng do hạn chế được đặt bởi Unicode trên bộ ký tự, UCS-2 chỉ có thể đại diện cho 63.488 ký tự trong khi 2.048 ký tự bị hạn chế bởi Unicode.

💡 UCS-2 hiện đã lỗi thời và nó được thay thế sửa chữa bằng mã hóa UTF-16 .

UCS-4

UCS-4 là mã hóa chiều rộng cố định 32 bit (4 byte), có nghĩa là 32 bit sẽ được sử dụng để mã hóa một ký tự. Vì một ký tự chiếm 4 byte bộ nhớ nên 4,294,967,296 ký tự (²³²) ký tự có thể được biểu diễn bằng UCS-4.

Tuy nhiên, bảng mã Unicode chỉ có thể chứa 1.112.064 ký tự. Vì UCSUnicode tuân theo cùng một bộ ký tự, UCS-4 bị hạn chế chỉ được mã hóa 1.112.064 ký tự.

💡 Mã hóa UCS-4 và UTF-32 tựa như nhau về mọi mặt .

Mặc dù các lược đồ mã hóa UCS đã thêm hỗ trợ cho các ký tự bổ sung nhưng do bản chất của chúng là mã hóa có độ rộng cố định, nên cuối cùng các mã hóa UTF đã được sử dụng.

🏇 Vì UCS-2 hiện đã lỗi thời và giống hệt UTF-16 trong khi UCS-4 giống hệt UTF-32, chúng tôi sẽ không xem xét chi tiết của chúng. Tuy nhiên, trong khi học mã hóa UTF, bạn có thể hiểu được cách thức các mã hóa này.

⦿ - - - - ⦿

Mã hóa UTF

Cho đến nay, chúng ta đã tìm hiểu về các bảng mã có độ rộng cố định. Một lược đồ mã hóa có độ rộng cố định sử dụng độ dài cố định của các bit để lưu trữ điểm mã của một ký tự. ASCII sử dụng 8 bit để mã hóa một ký tự trong khi UCS-2 sử dụng 16 bit .

Một mã hóa biến-width trong trái ngược với mã hóa chiều rộng cố định sử dụng bit biến để mã hóa một nhân vật khi cần thiết. Ví dụ, khi điểm mã của một ký tự có thể được biểu diễn bằng 8 bit, bảng mã này sẽ sử dụng 8 bit để lưu điểm mã. Ví dụ, điểm mã 65₁₀ hoặc ký tự Một .

Nhưng khi điểm mã của ký tự không thể được biểu diễn bằng 8 bit, hơn 8 bit được sử dụng. Vì chúng ta có thể lưu trữ dữ liệu theo bội số của 8 bit, nên 2 byte trở lên được sử dụng để mã hóa điểm mã có độ rộng ký tự lớn hơn 256 .

Ví dụ, ký tự Āđiểm mã256₁₀ hoặc 100₁₆ ( trong Unicode ), chỉ có thể được lưu trữ trong hơn 1 byte bộ nhớ, vì giá trị tối thiểu có thể được lưu trữ trong 1 byte là 255 .

Mã hóa UTF cung ứng nhiều lược đồ mã hóa, cả chiều rộng cố định và thắt chặt và chiều rộng đổi khác. Các lược đồ mã hóa như vậy là UTF-8, UTF-16 và UTF-32 .

UTF-8

UTF-8 là một lược đồ mã hóa có độ dài thay đổi 8 bit được thiết kế để tương thích với mã hóa ASCII. Trong mã hóa này, từ 1 đến 4 byte có thể được sử dụng để mã hóa một ký tự ( không giống như ASCII sử dụng 1 byte cố định ). Mã hóa UTF-8 sử dụng bộ ký tự UTF cho các điểm mã ký tự.

Trong một mã hóa chiều dài thay đổi kế hoạch, một nhân vật được mã hóa trong nhiều của N bit. Ví dụ, trong mã hóa UTF-8, một ký tự có thể chiếm M x 8 bit bộ nhớ, trong đó N8 ( cố định ) và M có thể là 1 đến 4 ( biến ).

Ở đây, N còn được gọi là đơn vị mã. Đơn vị mã là khối xây dựng của điểm mã ( biểu diễn ký tự được mã hóa ). Trong mã hóa UTF-8, đơn vị mã là 8 bit hoặc 1 byte vì một ký tự được mã hóa bằng N byte .

Ý tưởng chính đằng sau UTF-8 là mã hóa tổng thể những ký tự hoàn toàn có thể sống sót trên hành tinh nhưng đồng thời tương hỗ mã hóa ASCII. Điều này có nghĩa là một ký tự được mã hóa ASCII sẽ giống trọn vẹn trong UTF-8 .
💡 Điều này cũng có nghĩa là UTF-8 là bộ siêu của ASCII .

01000001  ->  A (ASCII)
01000001  ->  A (UTF-8)

Niềm vui thực sự bắt đầu khi chúng ta phải mã hóa một ký tự vượt ra ngoài bảng mã ASCII. Chúng ta biết rằng một ký tự ASCII chỉ sử dụng 7 bit bộ nhớ do đó giá trị tối đa của điểm mã bị giới hạn ở 127. Vậy làm cách nào để mã hóa một ký tự có điểm mã lớn hơn 127?

💡 Unicode Consortium duy trì bộ ký tự được sử dụng trên các bảng mã UCS và UTF. Mỗi ký tự có một điểm mã cố định. Bạn có thể theo dõi bảng này để tra cứu bất kỳ ký tự nào và xem điểm mã của nó ở dạng thập lục phân.

Câu trả lời đơn giản là, hãy thêm nhiều đơn vị mã hơn. Nếu một ký tự có điểm mã lớn hơn 127, giả sử 128, chúng tôi sẽ thêm một đơn vị mã nữa ( thêm 1 byte ) và bộ giải mã UTF-8 sẽ xem xét 2 byte để tạo điểm mã của ký tự ( điều này sẽ mang lại nhiều hơn giá trị hơn 127 ).

Nhưng câu hỏi thực sự là, làm thế nào bộ giải mã sẽ biết nếu nó cần xem xét một byte, hai byte hoặc nhiều hơn để giải mã một ký tự ?

Hãy xem xét một ví dụ đơn giản. Chúng tôi cần lưu trữ một tệp văn bản thuần túy có chứa văn bản dõg trong mã hóa UTF-8. Theo hiểu biết trước đó của chúng tôi, ký tự dg thuộc bảng ASCII nhưng ký tự õ thì không.

Nếu chúng ta tra cứu điểm mã của ký tự o trong bảng mã UTF, điểm mã của nó là 245₁₀ hoặc F5₁₆. Do đó, phải mất nhiều hơn một đơn vị mã để mã hóa một ký tự, nhưng có bao nhiêu ?

Tiêu chuẩn UTF-8 tuân theo một cách tiếp cận rất cơ bản. Nếu một ký tự có điểm mã lớn hơn 127, thì có thể mất 2 hoặc nhiều đơn vị mã để mã hóa ký tự. Bộ giải mã UTF-8 có thể xem xét các bit bắt đầu của đơn vị mã và tính toán bao nhiêu byte sau nó cần được xem xét.

  • Trong khi đọc tệp, nếu bộ giải mã UTF-8 gặp một bytebit 0 đứng đầu, điều đó có nghĩa là ký tự đó là từ bộ ký tự ASCII và chỉ chiếm 1 đơn vị mã hoặc 1 byte. Do đó UTF-8 chỉ phải đọc byte đó để tạo ra điểm mã ( do đó là một ký tự ). Và sau đó nó di chuyển đến điểm mã tiếp theo. Ví dụ: nếu đơn vị mã là 01000001₂, thì nó là một ký tự ASCII là A với điểm mã 65₁₀ hoặc 41₁₆ .
  • Nếu bộ giải mã UTF-8 gặp một đơn vị mã ( byte ) với 1 bit đứng đầu, thì nó biết rằng đây không phải là một ký tự ASCII và ký tự này có thể nhận 2 hoặc nhiều đơn vị mã.
  • Nếu một nhân vật có 2 hay nhiều đơn vị mã, mỗi đơn vị mã ngoại trừ thứ nhất có lãnh đạo 2 bit thiết lập để 10₂ để biểu thị rằng họ là tiếp tục byte hoặc tiếp tục các đơn vị mã.
  • Các đang dẫn đầu đơn vị sử dụng bit hàng đầu nói với các bộ giải mã UTF-8 có bao nhiêu sự tiếp nối các đơn vị mã ký tự này mất.
  • (Nguồn: https://en.wikipedia.org/wiki/UTF-8)

Tuy nhiên, nếu điểm mã của một ký tự nằm trong khoảng từ 80₁₆ đến 7FF₁₆ thì nó cần hai đơn vị mã để mã hóa ký tự. Các đơn vị mã đầu tiên có 1 10 bit hàng đầu để biểu thị rằng nó sau 1 đơn vị mã tiếp tục. Đơn vị mã tiếp tục khác bắt đầu bằng 10₂ .

Tương tự, nếu điểm mã của một ký tự nằm trong khoảng 800₁₆ đến FFFF₁₆, thì nó cần ba đơn vị mã để mã hóa ký tự. Các đơn vị mã đầu tiên có 11 10 bit hàng đầu để biểu thị rằng nó sau 2 đơn vị mã tiếp tục. Các đơn vị mã tiếp tục còn lại bắt đầu bằng 10₂ .

Một bộ giải mã UTF-8 chỉ cần nhìn vào đơn vị mã hàng đầu để tính xem nó cần xem xét bao nhiêu byte ( đơn vị mã ) để giải mã một ký tự. Sau đó, nó có thể tính toán giá trị điểm mã từ các bit được sử dụng để mã hóa điểm mã ( được đề cập trong cột Bits for code point trong bảng trên ).

Hãy xem xét ví dụ cũ của chúng tôi. Chúng ta cần mã hóa văn bản dõg trong UTF-8. Như chúng ta đã biết, dg thuộc bảng ASCII, điểm mã của chúng lần lượt là 100₁₀103₁₀ và trong hệ nhị phân, chúng là 1100100₂1100111₂ .

Đối với ký tự õ, chúng ta cần chuyển đổi giá trị điểm mã của nó 245₁₀ thành số nhị phân 11 bit, kết quả là 00011 110101₂. Sau đó, chúng ta có thể phù hợp với biểu diễn nhị phân này trong chuỗi byte cho mã hóa UTF-8 ( xem bảng trên ).

💡 Nếu bạn bối rối về lý do tại sao chúng tôi sử dụng số nhị phân 11 bit, vui lòng tham khảo bảng trên. Vì điểm mã 245₁₀ hoặc F5₁₆ thuộc hàng thứ 2 nên chúng ta có 11 bit để mã hóa điểm mã với 2 đơn vị mã.

Do đó, văn bản ở đầu cuối của chúng tôi trong mã hóa UTF-8 sẽ giống như bên dưới .

01100100 11000011 10110101 01100111    <- binary
64       C3       B5       67          <- hex
-------- ----------------- --------
d        õ                 g           <- characters

Bạn có thể sử dụng công cụ trực tuyến này để làm điều tương tự và tự xem kết quả. Nhập 64 C3 B5 67 vào hộp văn bản thập lục phân để xem các ký tự.

💡 Bạn cũng có thể sử dụng công cụ trực tuyến này để tạo chuỗi byte UTF-8 cho một ký tự mà không cần đập đầu vào tường.

Ưu và nhược điểm

UTF-8 là một chương trình mã hóa tuyệt vời và có nhiều nguyên do cho nó. Vì nó tương hỗ năng lực thích hợp với ASCII, bất kỳ tài liệu được mã hóa ASCII nào đều là tài liệu UTF-8 hợp lệ. Tuy nhiên, điều ngược lại là không đúng ( xem ví dụ trước đó ) .

Vì UTF-8 là một mã hóa có độ dài thay đổi, nó cần phải lãng phí bộ nhớ như UCS-2 hoặc UCS-4 để biểu diễn một ký tự có 16 bit cố định hoặc 32 bit mà lẽ ra có thể dễ dàng mã hóa thành 8 bit .

UTF-8 đang tự đồng bộ hóa. Điều này có nghĩa là nếu một chương trình mã hóa tệp văn bản UTF-8 nhảy ở một đơn vị mã ngẫu nhiên, nó sẽ biết khi nào đơn vị mã đứng đầu tiếp theo của một ký tự bắt đầu. Nó chỉ cần xem xét các bit ban đầu của đơn vị mã.

💡 Tự đồng nhất hóa là rất quan trọng so với bất kể mã hóa ký tự tốt nào. Nếu một trình đọc văn bản vô tình gặp một byte ngẫu nhiên, nó không phải khởi đầu đọc tài liệu từ đầu để tìm ký tự hợp lệ tiếp theo hoặc trước đó từ byte đó .

Mã hóa UTF-8 cũng không phải lo lắng về độ bền của hệ thống. Điều này là do đơn vị mã UTF-8 chỉ dài 8 bit. Cuối cùng, tất cả các mã hóa UTF được đọc dưới dạng một dòng ( chuỗi ) các đơn vị mã. Do đó trong UTF-8, chỉ 8 bit được đọc tại một thời điểm để tạo ra một giá trị số ( điều này sẽ dễ hiểu trong phần UTF-16 ) .

Do những thực tế này, hầu hết các trang web được cung cấp trên internet đều được mã hóa UTF-8 . Ngoài ra, hầu hết các tài liệu văn bản được chia sẻ qua internet đều được mã hóa UTF-8. Vì vậy UTF-8 đang nhanh chóng trở thành tiêu chuẩn trên thực tế để mã hóa.

Một trang web hoặc một tài liệu trên internet có thể gửi thông tin về cách mã hóa của nó trong Content-Typetiêu đề, thường là như thế Content-Type: ; charset=. Do đó, đối với một trang HTML được mã hóa bằng UTF-8 sẽ gửi Content-Type: text/html; charset=UTF-8tiêu đề kèm theo phản hồi.

💡 HTML5 sử dụng mã hóa UTF-8 làm mã hóa mặc định của tài liệu HTML trừ khi được đề cập trong thẻ META bộ ký tự, hãy đọc thêm .

Cơ quan cấp số được ấn định trên Internet ( IANA ) thích UTF-8 hoặc utf-8 làm định danh cho tài liệu được mã hóa UTF-8. Vì vậy, bạn nên chú ý đến thông tinContent-Type tiêu đề hoặc siêu thông tin của tệp vì nếu tệp được mã hóa trong một lược đồ nhưng lại thông báo về lược đồ kia có thể gây ra sự cố.

Bất chấp những quyền lợi này của UTF-8, một số ít người hoàn toàn có thể tranh luận rằng UTF-8 không hiệu suất cao lắm khi màn biểu diễn những ký tự bên ngoài khoanh vùng phạm vi ASCII, chính bới những ký tự đó cần được mã hóa với hơn 1 byte .

Do đó, một số ngôn ngữ như JavaJavaScript sử dụng UTF-16 làm lược đồ mã hóa ký tự mặc định của chúng. UTF-16 sử dụng 2 byte cho mỗi đơn vị mã nhưng nó mang lại rất nhiều rắc rối với nó. Hãy đi sâu vào vấn đề đó.

UTF-16

UTF-16 là lược đồ mã hóa độ dài thay đổi 16-bit và nó sử dụng bộ ký tự UTF cho các điểm mã ký tự. Điều này có nghĩa là một ký tự được mã hóa UTF-16 sẽ có một đơn vị mã 16 bit .

Như chúng ta biết rằng một ký tự được mã hóa UTF-8 có thể được biểu diễn bằng 1 đến 4 đơn vị mã, một ký tự UTF-16 có thể được biểu diễn bằng 1 hoặc 2 đơn vị mã. Do đó, một ký tự UTF-16 có thể chiếm 16 hoặc 32 bit bộ nhớ dựa trên điểm mã của nó .

Trước khi đi sâu vào những thông số kỹ thuật kỹ thuật mã hóa UTF-16, hãy hiểu cách chúng tôi hoàn toàn có thể làm cho UTF-16 hoạt động giải trí .

Vì chúng tôi có đơn vị mã 16-bit, về lý thuyết, chúng tôi có thể mã hóa 2¹⁶ ký tự từ điểm mã 0 đến 65,535. Nhưng nếu chúng ta có một ký tự có điểm mã lớn hơn 65,535 thì sao? Trong trường hợp đó, chúng ta có thể thêm một đơn vị mã khác .

Với đơn vị mã phụ, chúng tôi có thể mã hóa tổng cộng 2³² ký tự, tức là hơn 4M. Nhưng câu hỏi đặt ra là, làm thế nào một bộ giải mã UTF-16 sẽ biết rằng nó cần xem xét 2 đơn vị mã để giải mã một ký tự?

UTF-8 đã giải quyết vấn đề này bằng cách đặt các bit ban đầu của đơn vị mã đầu tiên và đơn vị mã tiếp tục thành một số giá trị bit cụ thể mà bộ giải mã UTF-8 có thể sử dụng để trừ đi bao nhiêu đơn vị mã mà một ký tự có thể lấy.

Chúng ta hoàn toàn có thể làm tương tự như với đơn vị chức năng mã UTF-16 nhưng sau đó tất cả chúng ta phải quyết tử một số ít bit trong đơn vị chức năng mã cho tính năng này. Chúng ta hoàn toàn có thể đặt 1 số ít bit khởi đầu của một đơn vị chức năng mã thành một giá trị có ý nghĩa nào đó mà bộ giải thuật UTF-16 hoàn toàn có thể hiểu được .

Ngoài ra, để cung cấp năng lượng tự đồng bộ hóa cho các đơn vị mã, một đơn vị mã phải có khả năng phân biệt đó là đơn vị mã ban đầu hay đơn vị mã tiếp tục và không phải là một ký tự của một đơn vị mã.

Vì vậy Unicode quyết định hy sinh 6 bit ban đầu của đơn vị mã chỉ để lại 10 bit để mã hóa điểm mã của một ký tự trên mỗi đơn vị mã. Nếu một ký tự cần 2 đơn vị mã, 20 bit bộ nhớ ( trong số 32 bit hoặc 4 byte ) chứa thông tin điểm mã thực của ký tự.

Vậy những bit ban đầu này là gì và làm thế nào những bit này tạo ra vết lõm trong bộ ký tự UTF? Hãy cùng theo dõi ví dụ dưới đây.

1101 10xx xxxx xxxx    1101 11xx xxxx xxxx
FIRST CODE UNIT----    SECOND CODE UNIT---

Bây giờ chúng ta có 10 bit cho mỗi đơn vị mã để chơi, phạm vi chúng ta có thể chơi trong phạm vi nào? Cuối cùng, có bao nhiêu ký tự có thể được mã hóa trong hai đơn vị mã của bảng mã UTF-16?

Đừng lo ngại, tất cả chúng ta sẽ nói về những ký tự được mã hóa chỉ trong một đơn vị chức năng mã .

Nếu bạn nhìn vào các mẫu đơn vị mã ở trên, chúng ta có một dải từ 1101 1000 0000 0000₂ đến 1101 1111 1111 1111₂. Điều đó tương đương với D800₁₆ đến DFFF₁₆ .

💡 Đơn vị mã đầu tiên có dải từ D800₁₆ đến 6FFF₁₆ và đơn vị mã thứ hai có dải từ DC00₁₆ đến DFFF₁₆. Chúng tôi có thể nhận được những giá trị này bằng cách chuyển tất cả các điểm mã bit : trêntắt .

Vì UTF-16 phải tự đồng bộ hóa, các điểm mã giữa D800₁₆DFFF₁₆ không được đại diện cho một ký tự trong UTF-16. Vì tất cả các mã hóa UTF tuân theo cùng một bộ ký tự UTF, các điểm mã này bị hạn chế bởi UTF và chúng không và sẽ không được gán cho bất kỳ ký tự nào .

Các điểm mã giữa D800₁₆DFFF₁₆ không đại diện cho bất kỳ ký tự nào, do đó chúng được gọi là điểm mã thay thế hoặc cùng nhau chúng còn được gọi là cặp thay thế .

Điểm mã đại diện đầu tiên ( từ đơn vị mã đầu tiên ) còn được gọi là đại diện thay thế cao và điểm mã thứ hai ( từ đơn vị mã thứ hai ) cũng được gọi là đại diện thấp. Tạo ra tổng số 2048 điểm mã, 1024 cho mỗi điểm thay thế.

💁‍♂ Các điểm mã thay thế đã hy sinh mạng sống của chúng để chúng tôi có thể mã hóa nhiều ký tự hơn với hai đơn vị mã. Nghĩ về điều đó!

Vì vậy, câu hỏi lớn, chúng ta có thể mã hóa một ký tự bằng một đơn vị mã duy nhất là UTF-16 không? Câu trả lời là . UTF-16 là một lược đồ mã hóa có độ dài thay đổi 16 bit. Vậy điều đó có nghĩa là chúng ta có thể mã hóa 2¹⁶ ký tự bằng một đơn vị mã duy nhất không?

Câu trả lời là KHÔNG. Về lý thuyết, chúng tôi có thể mã hóa 2¹⁶ ký tự với điểm mã 0000₁₆ ( 0₁₀ ) thành FFFF₁₆ ( 65535₁₀ ) nhưng điểm mã giữa D800₁₆DFFF₁₆ không đại diện cho bất kỳ ký tự nào vì chúng được bảo lưu.

Do đó, an toàn khi mã hóa các ký tự từ 0000₁₆ sang D7FF₁₆E000₁₆ thành FFFF₁₆, để lại các ký tự này chiếm 63.488 ( 65536–2048 ) ký tự. Điều này chỉ dành cho các ký tự có thể được mã hóa chỉ trong một đơn vị mã của UTF-16.

Vì chúng tôi có tổng cộng 20 bit để xử lý khi nói đến các ký tự hơn số có thể được mã hóa trong 2 đơn vị mã UTF-16, chúng tôi có thể mã hóa thêm 2²⁰ ký tự, tức là 1.048.576 ký tự.

Vì vậy, trong tổng số, chúng ta có thể mã hóa 1.048.576 + 63.488 trong đó số tiền 1.112.064 ký tự ( hơn 1 triệu ký tự ). Đây là giới hạn của bộ ký tự UTF. Vì UTF-16 có thể mã hóa nhiều ký tự này, các mã hóa UTF khác không thể đại diện cho các ký tự ngoài những ký tự này.

Điểm mã bộ ký tự UTF

Như chúng ta biết rằng một điểm mã là một giá trị thập phân được gán cho một ký tự, chúng tôi ( Unicode ) không được gán một điểm mã không hợp lệ cho một ký tự thực. Cho đến nay, các điểm mã không hợp lệ là các điểm mã thay thế .

Chỉ với một đơn vị mã UTF-16 duy nhất, chúng ta có thể mã hóa 63.488 ký tự từ 0000₁₆ đến D7FF₁₆E000₁₆ sang FFFF₁₆. Điểm mã cuối cùng là 65,535. Chúng được gọi là các ký tự BMP (sẽ giải thích ở phần sau ).

Với hai đơn vị mã UTF-16, chúng ta có thể mã hóa 1.048.576 ký tự. Vì chúng ta không thể bắt đầu lại từ giá trị 0 ( điểm mã ) vì chúng đứng sau các ký tự BMP, nên chúng ta cần bù trừ chúng bằng 65,536. Các ký tự này được gọi là các ký tự Phụ (sẽ giải thích ở phần sau ).

Do đó, ký tự phụ đầu tiên có giá trị điểm mã là 65536₁₀, tương đương với 10000₁₆. Vì chúng ta có thể mã hóa 1.048.576 ký tự với hai đơn vị mã UTF-16, điểm mã cuối cùng là 1114111₁₀ tương đương với 10FFFF₁₆ .

Vì vậy, hãy chia nhỏ mọi thứ trong một dạng bảng đơn thuần .

+-----------+---------------------+--------------------+
  | UTF-16 CU | Code Point          |                    |
  +-----------+---------------------+--------------------+
  | 1         | 0000₁₆ - D7FF₁₆     | valid              |
  +-----------+---------------------+--------------------+
  | 1         | D800₁₆ - DFFF₁₆     | invalid(surrogate) |
  +-----------+---------------------+--------------------+
  | 1         | E000₁₆ - FFFF₁₆     | valid              |
  +-----------+---------------------+--------------------+
  | 2         | 10000₁₆ - 10FFFF₁₆  | valid              |
  +-----------+---------------------+--------------------+
  |           | 110000₁₆ - FFFFFF₁₆ | unassigned         |
  +-----------+---------------------+--------------------+

Như chúng ta có thể thấy từ bảng trên, cả A đều có thể được mã hóa chỉ bằng một đơn vị mã UTF-16 vì giá trị của chúng nhỏ hơn FFFF₁₆ .

Khi chúng ta phải mã hóa một ký tự chỉ trong một đơn vị mã, chúng ta chỉ cần chuyển đổi điểm mã của ký tự đó thành một số nhị phân 16 bit. Đối với các ký tự A, 00000000 01000001₂ là biểu diễn UTF-16.

Tương tự, đối với ký tự , chúng ta chỉ cần chuyển đổi điểm mã 906₁₆ của nó thành số nhị phân 16 bit là 00001001 00000110₂ .

Thông thường, chúng tôi biểu diễn các đơn vị mã của một ký tự dưới dạng số thập lục phân. Do đó, đối với ký tự A, biểu diễn UTF-16 là 0041₁₆ và tương tự, đối với ký tự, biểu diễn UTF-16 0906₁₆ .

Đối với nhân vật 😊, mọi thứ có một chút khác biệt. Điểm mã của nó là 1F60A₁₆. Nếu chúng ta nhìn vào bảng UTF-16 được đề cập ở trên, nó phải được mã hóa bằng 2 đơn vị mã UTF-16. Vậy chúng ta bắt đầu như thế nào?

Đầu tiên, chúng ta cần trừ 10000₁₆ từ điểm mã. Lý do là, mọi ký tự được mã hóa trong 2 đơn vị mã của UTF-16 đều đứng sau các ký tự BMP có điểm mã cuối cùng là FFFF₁₆ .

Do đó, để có được giá trị thực của các bit được sử dụng để mã hóa ( là 20 trong 2 đơn vị mã ), chúng ta cần lấy điểm mã trừ đi 10000₁₆ và sử dụng số cuối cùng để tạo ra 20 bit này.

💡 Để giúp bạn hiểu rõ hơn, ký tự đầu tiên được biểu diễn bằng 2 đơn vị mã của UTF-16 sẽ có tất cả 20 bit được đặt thành 0. Vì vậy, giá trị của các bit được sử dụng để mã hóa điểm mã của ký tự này là 0. Nhưng vẫn còn, điểm mã của nó là 10000₁₆ theo bộ ký tự Unicode. Điều này là do giá trị mang lại bởi 20 bit này được thêm vào 10000₁₆ để tạo ra điểm mã cuối cùng.

Như đã thấy trước đó, 2 mã đơn vị chức năng này trông giống như bên dưới .

1101 10xx xxxx xxxx    1101 11xx xxxx xxxx
FIRST CODE UNIT----    SECOND CODE UNIT---

Bây giờ chúng ta cần chuyển F60A₁₆ thành số nhị phân 20 bit và điền 20 bit trong mẫu đơn vị mã ở trên. F60A₁₆ trong hệ nhị phân là 0000111101 1000001010₂. Bây giờ chúng ta có thể điền 20 bit giữ chỗ này.

Dưới đây là những đơn vị chức năng mã ở đầu cuối .

1101 1000 0011 1101    1101 1110 0000 1010
0xD83D                 0xDE0A

(Công cụ nhà phát triển Chrome)

Bạn cũng có thể sử dụng công cụ trực tuyến này để tạo điểm mã UTF-16.

Máy bay ký tự Unicode

Máy bay là một nhóm liên tục gồm 2¹⁶ hoặc 65.536 điểm mã. Vì UTF-16 đã hạn chế các điểm mã ở mức tối đa là 10FFFF₁₆, chúng tôi có tổng cộng 17 mặt phẳng ký tự trong tiêu chuẩn Unicode bắt đầu từ 0 đến 16.

2¹⁶ ký tự có thể được xác định bởi đơn vị mã duy nhất của UTF-16 ( bao gồm cả các điểm mã thay thế ), nó tạo thành mặt phẳng đầu tiên (thứ 0 ). Máy bay này chứa gần như tất cả các ký tự trong các ngôn ngữ cơ bản trên thế giới. Đây là lý do tại sao mặt phẳng này được gọi là Mặt phẳng Đa ngôn ngữ Cơ bản hoặc BMP .

Tiếp theo, chúng tôi có các điểm mã được xác định bởi hai đơn vị mã của UTF-16. Chúng chứa 2 ²⁰ ký tự vì chúng ta có 20 bit để mã hóa giá trị điểm mã. Chúng được chia thành 16 mặt phẳng (2⁴ x 2¹⁶). Chúng được gọi là mặt phẳng bổ sung .

💡 Để biết thêm thông tin về những chiếc máy bay này, hãy đọc tài liệu Wikipedia này .

So sánh với UCS-2

UCS-2 là mã hóa độ rộng cố định 16 bit. Điều đó có nghĩa là chỉ có một đơn vị mã 16 bit được sử dụng để biểu diễn một điểm mã. Về lý thuyết, UCS-2 có thể đại diện cho 2¹⁶ ký tự riêng biệt nhưng có một sự thay đổi.

💡 BTW, chúng tôi đang sử dụng thuật ngữ đơn vị mã trong bảng mã độ rộng cố định này để hiểu mối quan hệ giữa UTF-16. Trong thực tế, không có cái gọi là đơn vị mã trong bất kỳ mã cố định nào.

Vì UCS tuân theo bộ ký tự Unicode, mã hóa của những ký tự trong UCS-2 giống với mã hóa của những ký tự trong UTF-16 được biểu lộ bằng một đơn vị chức năng mã .
💡 Vì UCS tuân theo bộ ký tự Unicode, nó không hề mã hóa một ký tự hợp lệ với những điểm mã dành riêng cho những đại diện thay mặt .

Tóm lại, UCS-2 chứa các ký tự của Mặt phẳng đa ngôn ngữ Cơ bản. Đây là lý do, một số tài liệu và phần mềm cũ hơn đã sử dụng mã hóa UCS-2. Nhưng mã hóa UCS-2 đã trở nên lỗi thời và UTF-16 được ưu tiên hơn.

Endianness và BOM

Như chúng ta đã thảo luận trước đây, một tài liệu được mã hóa UTF ở cấp độ thấp chứa chuỗi các đơn vị mã. Đối với UTF-8, đơn vị mã dài 8 bit trong khi đối với UTF-16, nó dài 16 bit. Các đơn vị mã này tạo nên các ký tự.

Bộ giải thuật UTF-8 hoặc UTF-16 đọc những đơn vị chức năng mã tuần tự, mỗi đơn vị chức năng mã một lần để tạo những ký tự .

Mỗi đơn vị mã đại diện cho một giá trị số mà bộ giải mã UTF-8 hoặc UTF-16 có thể xem xét và quyết định xem liệu nó có đủ để đại diện cho một ký tự hay không hoặc nó theo sau các đơn vị mã khác cũng cần được xem xét.

Khi nói đến UTF-8, mọi thứ thật đơn giản. Vì mỗi đơn vị mã dài 8 bit nên việc chuyển đổi số nhị phân 8 bit đó thành giá trị số rất nhanh chóng và dễ dàng. Tuy nhiên, đây không phải là trường hợp của UTF-16.

Đơn vị mã UTF-16 là số nhị phân 16 bit ( 2 byte ) bộc lộ giá trị điểm mã. Nói chung, để tạo ra giá trị số từ nhiều byte là rất phức tạp và những mạng lưới hệ thống khác nhau hoạt động giải trí khác nhau .

Hành vi này phụ thuộc vào endianness của hệ thống. Từ cuộc thảo luận trước đó của chúng ta về tính bền vững, có hai cách chúng ta có thể viết giá trị đơn vị mã UTF-16. Ở định dạng Big-endian hoặc Little-endian .

Ở định dạng Big-endian, MSB được tàng trữ tiên phong và LSB được tàng trữ sau cuối. Cho đến nay, chúng tôi đang viết giá trị đơn vị chức năng mã UTF-16 ở định dạng Big-endian. Để viết giá trị đơn vị chức năng mã UTF-16 trong Little-endian, tất cả chúng ta cần hoán đổi những byte .

Hãy nói về nhân vật . Từ ví dụ trước đó, nó có thể được biểu diễn bằng một đơn vị mã UTF-16 và mã hóa của nó ở dạng biểu diễn thập lục phân trông giống như 0906₁₆ .

0906₁₆ là một đầu số 16 bit với 09 là MSB06 là LSB. Do đó, trong kiến trúc Big-endian, nó sẽ được lưu trữ là 09 06. Tuy nhiên, theo kiến trúc Little-endian, nó sẽ được lưu trữ là 06 09 .

Do đó, nghĩa vụ và trách nhiệm của chúng tôi là mã hóa những ký tự bằng cách chú ý quan tâm đến sự vững chắc của mạng lưới hệ thống để mạng lưới hệ thống hoàn toàn có thể đọc tài liệu UTF-16 một cách đúng mực .
Nhưng làm thế nào tất cả chúng ta hoàn toàn có thể biết trước liệu máy của người dùng có thích hợp với tài liệu được mã hóa hay không ? Và vì tính vững chắc của một mạng lưới hệ thống hoàn toàn có thể tác động ảnh hưởng đến cách một tài liệu được giải thuật, vậy làm cách nào để tất cả chúng ta san sẻ nó một cách công khai minh bạch ?

Đây là lúc BOM xuất hiện trong bức tranh. Một Byte Order Mark (BOM) là một chuỗi byte đó được thêm vào đầu của một tập tin văn bản hoặc dữ liệu văn bản.

Unicode đề xuất ký tự có điểm mã FEFF₁₆ để hoạt động như một BOM cho các mã hóa UTF-16 và UTF-32. Ký tự này phải trước ký tự đầu tiên của tài liệu. Tuy nhiên, ký tự này sẽ không được bộ giải mã xem xét trong đầu ra.

Nhân vật này ( U + FEFF ) là một phi phá vỡ không gian zero-width ( ZWNBSP ) nhân vật và nó vô hình. Do đó, ngay cả khi một bộ giải mã không nhận ra BOM, nó sẽ không tạo ra bất kỳ đầu ra hiển thị nào.

Ký tự này được biểu diễn trong một đơn vị mã duy nhất của UTF-16 và ở dạng biểu diễn thập lục phân, nó trông giống như FE ( MSB ) và FF ( LSB ).

Do đó, khi các ký tự được mã hóa ở định dạng Big-endian, chúng ta cần thêm FEFF làm BOM ở đầu tệp và khi các ký tự được mã hóa ở định dạng Little-endian, chúng ta cần thêm FFFE ( đảo ngược ) làm BOM ở đầu. của tệp.

Unicode khuyến nghị thêm BOM vào tài liệu được mã hóa UTF-16. Tuy nhiên, nếu thiếu BOM thì định dạng Big-endian được giả định .

IANA thích UTF-16 làm mã định danh để biểu thị tài liệu được mã hóa UTF-16. Tuy nhiên, UTF-16BE được sử dụng cho tài liệu được mã hóa ởđịnh dạng Big-endian UTF-16LE được sử dụng chođịnh dạng Little-endian .

Khi tên UTF-16BE hoặc UTF-16LE được sử dụng, thì BOM không được khuyến nghị thêm vào trước tệp. Ngay cả trong trường hợp này, nếu BOM được thêm vào, thì nó sẽ được coi là ký tự ZWNBSP và nó sẽ không bị bỏ qua.

💡 Tên UTF-16, UTF-16BE và UTF-16LE không phân biệt chữ hoa chữ thường .

Ưu và nhược điểm

UTF-16 hiệu suất cao vì nó chỉ có 2 đơn vị chức năng mã và vì hầu hết những ký tự được sử dụng đều nằm trong bộ BMP, chúng hoàn toàn có thể được trình diễn chỉ trong một đơn vị chức năng mã. Tuy nhiên, nó đi kèm với rất nhiều yếu tố .
Nhược điểm lớn nhất của UTF-16 là nó không thích hợp với ASCII. Vì những ký tự ASCII được mã hóa bằng một đơn vị chức năng mã duy nhất ( số 16 bit ), chúng không hề được giải thuật đúng cách bằng bộ giải thuật ASCII .
UTF-16 sử dụng khoảng trống không thiết yếu cho những ký tự ASCII. So với tài liệu được mã hóa UTF-8 chỉ chứa những ký tự ASCII, size của cùng một tài liệu được mã hóa bằng UTF-16 lớn hơn hai lần .
UTF-16 cũng bị tác động ảnh hưởng bởi độ bền của mạng lưới hệ thống. Nếu thiếu BOM và không sử dụng số nhận dạng mã hóa thích hợp ( như UTF-16LE ), thì tài liệu được mã hóa UTF-16 hoàn toàn có thể không được giải thuật đúng cách .

Do bản chất của mã hóa UTF-16, nó đã giới thiệu các điểm mã thay thế không thể đại diện cho các ký tự hợp lệ. Ngoài ra, nó đã giới hạn bộ ký tự Unicode thành 10FFFF₁₆ ( điểm mã cuối cùng ).

Bất chấp những thực tế này, một số ngôn ngữ lập trình như JavaScript, Java, v.v. và các hệ thống như Windows thích mã hóa UTF-16 hơn.

UTF-32

UTF-32 là lược đồ mã hóa chiều rộng cố định 32 bit có nghĩa là một đơn vị mã 32 bit duy nhất sẽ được sử dụng để mã hóa một ký tự.

Ngược lại với UTF-8 và UTF-16, vì chúng tôi không xử lý nhiều đơn vị mã nên việc mã hóa trong UTF-32 khá dễ dàng. Chúng ta chỉ cần chuyển đổi điểm mã của một ký tự thành số nhị phân 32 bit .

Hãy mã hóa 1 số ít ký tự trong UTF-32. Chúng tôi sẽ sử dụng những ký tự đã sử dụng trước đó cho đơn thuần .

Đối với ký tự A có mã điểm 41₁₆, biểu diễn nhị phân của nó là 1000001₂. Vì chúng ta phải lưu trữ điểm mã ở dạng 32-bit, chúng ta cần thêm vào bên trái số nhị phân bằng 0 bit. Điều này sẽ mang lại 00000000 00000000 00000000 01000001₂ hoặc 00 00 00 41₁₆ .

Đối với ký tự có điểm mã 906₁₆, biểu diễn nhị phân 32 bit của nó là 00000000 00000000 00001001 00000110₂ hoặc 00 00 09 06₁₆. Tương tự, đối với ký tự 😊 có mã điểm 1F60A₁₆, biểu diễn nhị phân của nó là 00000000 00000001 11110110 00001010₂ hoặc 00 01 F6 0A₁₆ .

💡 Bạn có thể sử dụng công cụ trực tuyến này để xem chuỗi byte được mã hóa UTF-32. Bạn chỉ cần sao chép và dán ký tự trong hộp văn bản utf8 .

So sánh với UCS-4

UCS-4 là lược đồ mã hóa độ rộng cố định và thắt chặt 32 bit và vì UCS sử dụng bộ ký tự UTF nên nó giống với UTF-32 theo mọi cách .

Endianness và BOM

Bộ giải mã UTF-32 xem xét 4 byte tuần tự để tạo ra giá trị điểm mã số, do đó nó sẽ bị ảnh hưởng bởi độ bền của hệ thống.

Do đó, Unicode khuyên bạn nên thêm Dấu thứ tự Byte ( BOM ) trước phần đầu của tệp được mã hóa UTF-32. Như chúng ta đã thấy trong UTF-16, chúng ta đã sử dụng ký tự ZWNBSP với điểm mã FFFE₁₆ .

Chúng ta cần thêm cùng một ký tự trong UTF-32 nhưng được mã hóa thành 4 byte. Do đó, khi chúng ta có ký tự được mã hóa ở định dạng Big-endian, chúng ta sử dụng chuỗi byte 00 00 FF FE làm BOM hoặc FE FF 00 00 trong trường hợp định dạng Little-endian .

Nếu thiếu BOM này trong tài liệu, định dạng Big-endian sẽ được bộ giải mã UTF-32 xem xét theo mặc định.

IANA thích UTF-32 làm mã định danh để biểu thị một tài liệu được mã hóa UTF-32. Tuy nhiên, UTF-32BE được sử dụng cho tài liệu được mã hóa ởđịnh dạng Big-endian UTF-32LE được sử dụng chođịnh dạng Little-endian .

Khi tên UTF-32BE hoặc UTF-32LE được sử dụng, thì BOM không được khuyến nghị thêm trước vào tệp. Nếu vẫn có một BOM được thêm vào, thì nó sẽ được coi là ký tự ZWNBSP và nó sẽ không bị bỏ qua.

💡 Tên UTF-32, UTF-32BE và UTF-32LE không phân biệt chữ hoa chữ thường .

Ưu và nhược điểm

Một nguyên do tuyệt vời để mã hóa dữ liệu văn bản trong UTF-32 là để tăng hiệu suất cao của bộ giải thuật UTF-32. Vì toàn bộ những ký tự UTF-32 khả thi hoàn toàn có thể được mã hóa chỉ trong một đơn vị chức năng mã, những thao tác tìm kiếm và sắp xếp rất nhanh gọn .

Tuy nhiên, nhược điểm lớn nhất của việc sử dụng mã hóa UTF-32 là tiêu tốn bộ nhớ. Vì tất cả các ký tự, ngay cả trong BMP sẽ sử dụng bộ nhớ 32-bit, nó không hiệu quả khi nói đến không gian đĩa hoặc băng thông mạng .

Như chúng ta biết rằng, điểm mã hợp lệ cuối cùng trong bảng mã UTF là 10FFFF₁₆ chỉ dài 6 byte, do đó, một ký tự mã hóa 32 bit sẽ luôn trống 1 byte và không được sử dụng.

Quy ước U +

Khi chúng ta phải xác định một ký tự Unicode với giá trị điểm mã của nó ở dạng số thập lục phân, Unicode khuyến nghị sử dụng tiền tố U + theo sau là 4 hoặc 6 chữ số điểm mã thập lục phân .

Đối với ký tự A có mã điểm 41₁₆, nó sẽ được biểu diễn bằng ký hiệu Unicode là U + 0041. Đối với ký tự có mã điểm 906₁₆, ký hiệu Unicode của nó sẽ là U + 0906. Tương tự, đối với ký tự 😊 có mã điểm 1F60A₁₆, ký hiệu Unicode của nó sẽ là U + 1F60A .

Liên kết

Dưới đây là một số ít link có ích để quy đổi ký tự Unicode .

Chuyển đổi nhị phân, thập lục phân và thập phân

  1. Chuyển đổi hệ thập lục phân sang nhị phân
  2. Chuyển đổi từ thập phân sang thập lục phân
  3. Chuyển đổi nhị phân sang thập lục phân
  1. Unicode và Unicode Consortium
  2. UTF-8 Wikipedia
  3. UTF-16 Wikipedia
  4. UTF-32 Wikipedia
  5. Câu hỏi thường gặp của UTF (Câu hỏi thường gặp)
  6. Máy bay BMP và Unicode
  1. Nhân vật Điểm mã
  2. Điểm mã Ký tự
  3. Ký tự UTF-8, UTF-16, UTF-32
  4. Đơn vị mã UTF-8 ( hex ) → ký tự
  5. Đơn vị mã UTF-16 ( hex ) → Ký tự
  6. Đơn vị mã UTF-32 ( hex ) → Ký tự
  7. Nhân vật → UTF-16 ( chơi với BOM và Endianness )
  8. Nhân vật → UTF-32 ( chơi với BOM và Endianness )
  1. Bảng ASCII
  2. Bảng ISO 8859–1
  3. Bảng Unicode

(thatisuday.com / GitHub / Twitter / StackOverflow / Instagram)

Source: https://dvn.com.vn
Category: Cảm Nang

Alternate Text Gọi ngay