Unicode là gì? mã hóa Unicode

Tiêu chuẩn này được đề xuất vào năm 1991 bởi tổ chức phi lợi nhuận Unicode Consortium (Unicode Inc.). Việc sử dụng tiêu chuẩn này cho phép bạn mã hóa một số lượng rất lớn các ký tự từ các tập lệnh khác nhau: Tài liệu Unicode có thể chứa các ký tự tiếng Trung, ký hiệu toán học, các chữ cái trong bảng chữ cái Hy Lạp, bảng chữ cái Latinh và Cyrillic và việc chuyển đổi các trang mã trở nên không cần thiết.

Tiêu chuẩn này bao gồm hai phần chính: bộ ký tự phổ quát (UCS) và họ mã hóa (UTF, định dạng chuyển đổi Unicode). Bộ ký tự phổ quát chỉ định sự tương ứng một-một giữa các ký tự và mã - các phần tử của không gian mã biểu thị các số nguyên không âm. Họ mã hóa xác định cách biểu diễn máy của một chuỗi mã UCS.

Tiêu chuẩn Unicode được phát triển để tạo ra một mã hóa ký tự đơn cho tất cả các ngôn ngữ viết hiện đại và cổ xưa. Mỗi ký tự trong tiêu chuẩn này được mã hóa bằng 16 bit, cho phép nó bao gồm số lượng ký tự lớn hơn nhiều so với mã hóa 8 bit được chấp nhận trước đó. Một điểm khác biệt quan trọng khác giữa Unicode và các hệ thống mã hóa khác là nó không chỉ gán một mã duy nhất cho mỗi ký tự mà còn xác định các đặc điểm khác nhau của ký tự đó, ví dụ:

Kiểu ký tự (chữ hoa, chữ thường, số, dấu chấm câu, v.v.);

Thuộc tính ký tự (hiển thị từ trái sang phải hoặc phải sang trái, dấu cách, ngắt dòng, v.v.);

Chữ hoa hoặc chữ thường tương ứng (tương ứng cho chữ thường và chữ in hoa);

Giá trị số tương ứng (đối với ký tự số).

Toàn bộ phạm vi mã từ 0 đến FFFF được chia thành nhiều tập hợp con tiêu chuẩn, mỗi tập hợp con tương ứng với bảng chữ cái của ngôn ngữ hoặc với một nhóm ký tự đặc biệt có chức năng tương tự nhau. Sơ đồ bên dưới chứa danh sách chung các tập hợp con Unicode 3.0 (Hình 2).

Hình 2

Chuẩn Unicode là cơ sở để lưu trữ văn bản trong nhiều hệ thống máy tính hiện đại. Tuy nhiên, nó không tương thích với hầu hết các giao thức Internet vì mã của nó có thể chứa bất kỳ giá trị byte nào và các giao thức thường sử dụng byte 00 - 1F và FE - FF làm byte dịch vụ. Để đạt được khả năng tương thích, một số định dạng chuyển đổi Unicode (UTF, Định dạng chuyển đổi Unicode) đã được phát triển, trong đó UTF-8 là phổ biến nhất hiện nay. Định dạng này xác định các quy tắc sau để chuyển đổi từng mã Unicode thành một tập hợp byte (một đến ba) phù hợp để truyền tải bằng các giao thức Internet.


Ở đây x,y,z biểu thị các bit của mã nguồn cần được trích xuất, bắt đầu bằng bit có ý nghĩa nhỏ nhất và được nhập vào các byte kết quả từ phải sang trái cho đến khi tất cả các vị trí được chỉ định được lấp đầy.

Sự phát triển hơn nữa của tiêu chuẩn Unicode gắn liền với việc bổ sung các mặt phẳng ngôn ngữ mới, tức là. các ký tự trong phạm vi 10000 - 1FFFF, 20000 - 2FFFF, v.v., trong đó nó được cho là bao gồm mã hóa cho các tập lệnh của ngôn ngữ chết không có trong bảng trên. Một định dạng mới, UTF-16, đã được phát triển để mã hóa các ký tự bổ sung này.

Vì vậy, có 4 cách chính để mã hóa byte Unicode:

UTF-8: 128 ký tự được mã hóa thành một byte (định dạng ASCII), 1920 ký tự được mã hóa thành 2 byte ((ký tự La Mã, Hy Lạp, Cyrillic, Coptic, Armenia, tiếng Do Thái, tiếng Ả Rập), 63488 ký tự được mã hóa thành 3 byte (tiếng Trung, tiếng Nhật, v.v.) .) 2.147.418.112 ký tự còn lại (chưa được sử dụng) có thể được mã hóa bằng 4, 5 hoặc 6 byte.

UCS-2: Mỗi ký tự được biểu thị bằng 2 byte. Mã hóa này chỉ bao gồm 65.535 ký tự đầu tiên từ định dạng Unicode.

UTF-16: Phần mở rộng của UCS-2, nó chứa 1.114.112 ký tự định dạng Unicode. 65.535 ký tự đầu tiên được biểu thị bằng 2 byte, phần còn lại bằng 4 byte.

USC-4: Mỗi ký tự được mã hóa thành 4 byte.

Vì trong một số hệ thống máy tính (ví dụ: Windows NT), các ký tự 16 bit cố định đã được sử dụng làm mã hóa mặc định, nên người ta quyết định chỉ mã hóa tất cả các ký tự quan trọng nhất trong 65.536 vị trí đầu tiên (cái gọi là tiếng Anh. mặt phẳng đa ngôn ngữ cơ bản, BMP). Phần còn lại của khoảng trắng được sử dụng cho "ký tự phụ". ký tự bổ sung): hệ thống chữ viết của các ngôn ngữ đã tuyệt chủng hoặc các ký tự, ký hiệu toán học và âm nhạc rất hiếm khi được sử dụng trong tiếng Trung Quốc.

Để tương thích với các hệ thống 16 bit cũ hơn, hệ thống UTF-16 đã được phát minh, trong đó 65.536 vị trí đầu tiên, ngoại trừ các vị trí trong khoảng U+D800...U+DFFF, được biểu diễn trực tiếp dưới dạng số 16 bit và phần còn lại được biểu diễn dưới dạng "cặp thay thế" "(phần tử đầu tiên của cặp từ vùng U+D800...U+DBFF, phần tử thứ hai của cặp từ vùng U+DC00...U+DFFF). Đối với các cặp thay thế, một phần không gian mã (2048 vị trí) trước đây dành cho “các ký tự dành cho mục đích sử dụng riêng” đã được sử dụng.

Vì UTF-16 chỉ có thể hiển thị 2 20 + 2 16 −2048 (1 112 064) ký tự nên số này được chọn làm giá trị cuối cùng của không gian mã Unicode.

Mặc dù vùng mã Unicode đã được mở rộng vượt quá 2 16 ngay từ phiên bản 2.0, nhưng các ký tự đầu tiên trong vùng "trên cùng" vẫn chưa được đặt cho đến phiên bản 3.1.

Vai trò của mã hóa này trong lĩnh vực web không ngừng tăng lên, vào đầu năm 2010, tỷ lệ trang web sử dụng Unicode là khoảng 50%.

Phiên bản Unicode

Khi bảng ký tự của hệ thống Unicode thay đổi và được bổ sung cũng như các phiên bản mới của hệ thống này được phát hành - và công việc này vẫn đang diễn ra, vì ban đầu hệ thống Unicode chỉ bao gồm Mặt phẳng 0 - mã hai byte - các tài liệu ISO mới cũng được phát hành. Hệ thống Unicode tồn tại trong tổng số các phiên bản sau:

  • 1.1 (tương ứng với tiêu chuẩn ISO/IEC 10646-1:), 1991-1995.
  • 2.0, 2.1 (cùng tiêu chuẩn ISO/IEC 10646-1:1993 cộng thêm các phần bổ sung: “Sửa đổi” từ 1 đến 7 và “Bản sửa đổi kỹ thuật” 1 và 2), tiêu chuẩn năm 1996.
  • 3.0 (tiêu chuẩn ISO/IEC 10646-1:2000), tiêu chuẩn 2000.
  • 3.1 (tiêu chuẩn ISO/IEC 10646-1:2000 và ISO/IEC 10646-2:2001), tiêu chuẩn 2001.
  • Tiêu chuẩn 3.2, 2002.
  • 4.0, tiêu chuẩn.
  • 4.01, tiêu chuẩn.
  • 4.1, tiêu chuẩn.
  • 5.0, tiêu chuẩn.
  • 5.1, tiêu chuẩn.
  • 5.2, tiêu chuẩn.
  • 6.0, tiêu chuẩn.
  • 6.1, tiêu chuẩn.
  • 6.2, tiêu chuẩn.

Không gian mã

Mặc dù các ký hiệu UTF-8 và UTF-32 cho phép mã hóa tối đa 2,31 (2.147.483.648) vị trí mã, nhưng người ta đã quyết định chỉ sử dụng 1.112.064 để tương thích với UTF-16. Tuy nhiên, ngay cả điều này cũng là quá đủ - ngày nay (trong phiên bản 6.0) chỉ có dưới 110.000 vị trí mã được sử dụng (109.242 đồ họa và 273 ký hiệu khác).

Không gian mã được chia thành 17 máy bay 2 16 (65536) ký tự mỗi ký tự. Mặt phẳng đất được gọi là nền tảng, nó chứa các ký hiệu của các tập lệnh được sử dụng phổ biến nhất. Mặt phẳng đầu tiên được sử dụng chủ yếu cho các tác phẩm lịch sử, mặt phẳng thứ hai dành cho các ký tự KKY hiếm khi được sử dụng, mặt phẳng thứ ba dành cho các ký tự Trung Quốc cổ. Máy bay 15 và 16 được phân bổ cho mục đích sử dụng cá nhân.

Để biểu thị các ký tự Unicode, người ta sử dụng ký hiệu như “U+” xxxx"(đối với mã 0...FFFF) hoặc "U+ xxxxx"(đối với mã 10000...FFFFF) hoặc "U+ xxxxxx"(đối với mã 100000...10FFFF), trong đó xxx- chữ số thập lục phân. Ví dụ: ký tự "I" (U+044F) có mã 044F = 1103.

Hệ thống mật mã

Hệ thống mã hóa phổ quát (Unicode) là một tập hợp các ký tự đồ họa và phương pháp mã hóa chúng để máy tính xử lý dữ liệu văn bản.

Biểu tượng đồ họa là biểu tượng có hình ảnh hiển thị. Ký tự đồ họa tương phản với ký tự điều khiển và ký tự định dạng.

Các ký hiệu đồ họa bao gồm các nhóm sau:

  • các chữ cái có trong ít nhất một trong các bảng chữ cái được hỗ trợ;
  • số;
  • dấu chấm câu;
  • các dấu hiệu đặc biệt (toán học, kỹ thuật, chữ tượng hình, v.v.);
  • dải phân cách.

Unicode là một hệ thống biểu diễn tuyến tính của văn bản. Các ký tự có thêm phần tử chỉ số trên hoặc chỉ số dưới có thể được biểu diễn dưới dạng một chuỗi mã được xây dựng theo các quy tắc nhất định (ký tự tổng hợp) hoặc dưới dạng ký tự đơn (biến thể nguyên khối, ký tự được soạn sẵn).

Sửa đổi ký tự

Biểu diễn ký hiệu “И” (U+0419) làm ký tự cơ sở “И” (U+0418) và ký tự sửa đổi “ ̆” (U+0306)

Các ký tự đồ họa trong Unicode được chia thành mở rộng và không mở rộng (không có chiều rộng). Các ký tự không mở rộng không chiếm khoảng trống trong dòng khi được hiển thị. Đặc biệt, chúng bao gồm các dấu trọng âm và các dấu phụ khác. Cả ký hiệu mở rộng và không mở rộng đều có mã riêng. Các ký hiệu mở rộng còn được gọi là các ký hiệu cơ bản. ký tự cơ sở) và không mở rộng - sửa đổi (eng. kết hợp các ký tự); Hơn nữa, cái sau không thể gặp nhau một cách độc lập. Ví dụ: ký tự "á" có thể được biểu diễn dưới dạng một chuỗi của ký tự cơ sở "a" (U+0061) và ký tự sửa đổi "́" (U+0301) hoặc dưới dạng ký tự nguyên khối "á" (U+ 00C1).

Một loại ký tự sửa đổi đặc biệt là bộ chọn biến thể kiểu. bộ chọn biến thể). Chúng chỉ ảnh hưởng đến những ký hiệu mà các biến thể đó được xác định. Trong phiên bản 5.0, các biến thể kiểu được xác định cho một số ký hiệu toán học, cho các ký hiệu của bảng chữ cái tiếng Mông Cổ truyền thống và cho các ký hiệu của chữ viết hình vuông tiếng Mông Cổ.

Các hình thức bình thường hóa

Vì các ký tự giống nhau có thể được biểu thị bằng các mã khác nhau, điều này đôi khi gây khó khăn cho việc xử lý, nên có các quy trình chuẩn hóa được thiết kế để giảm văn bản về một dạng chuẩn nhất định.

Tiêu chuẩn Unicode xác định 4 dạng chuẩn hóa văn bản:

  • Dạng chuẩn hóa D (NFD) là dạng phân rã chính tắc. Trong quá trình đưa văn bản về dạng này, tất cả các ký tự ghép được thay thế đệ quy bằng một số ký tự ghép, theo các bảng phân rã.
  • Dạng chuẩn hóa của C (NFC) là phân rã chính tắc theo sau là thành phần chính tắc. Đầu tiên, văn bản được rút gọn thành dạng D, sau đó thực hiện bố cục chuẩn - văn bản được xử lý từ đầu đến cuối và tuân theo các quy tắc sau:
    • Ký hiệu S là ban đầu, nếu nó có lớp sửa đổi số 0 trong cơ sở ký tự Unicode.
    • Trong bất kỳ chuỗi ký tự nào bắt đầu bằng ký tự ban đầu S, ký tự C bị chặn khỏi S khi và chỉ khi giữa S và C có bất kỳ ký tự B nào là ký tự ban đầu hoặc có cùng lớp sửa đổi hoặc lớn hơn C. Điều này là quy tắc chỉ áp dụng cho các chuỗi đã trải qua quá trình phân rã chính tắc.
    • Sơ đẳng Tổng hợp là một ký tự có phân tách chuẩn trong cơ sở ký tự Unicode (hoặc phân tách chuẩn cho Hangul và không được đưa vào danh sách ngoại lệ).
    • Một ký tự X có thể được kết hợp chính với một ký tự Y khi và chỉ khi có một tổ hợp Z chính tương đương với chuỗi .
    • Nếu ký hiệu C tiếp theo không bị chặn bởi ký hiệu cơ sở ban đầu L cuối cùng gặp phải và nó có thể được kết hợp chính thành công với nó thì L được thay thế bằng tổ hợp L-C và C bị loại bỏ.
  • Dạng chuẩn hóa KD (NFKD) là một dạng phân rã tương thích. Khi chuyển sang dạng này, tất cả các ký tự cấu thành được thay thế bằng cách sử dụng cả bản đồ phân tách Unicode chuẩn và bản đồ phân tách tương thích, sau đó kết quả sẽ được đưa vào thứ tự chính tắc.
  • Mẫu chuẩn hóa KC (NFKC) - phân tách tương thích theo sau kinh điển thành phần.

Thuật ngữ “kết hợp” và “phân tách” có nghĩa tương ứng là sự kết nối hoặc phân tách các ký hiệu thành các phần cấu thành của chúng.

Ví dụ

Văn bản gốc NFD NFC NFKD NFKC
người Pháp Pháp\u0327ais Fran\xe7ais Pháp\u0327ais Fran\xe7ais
A, E, J \u0410, \u0401, \u0419 \u0410, \u0415\u0308, \u0418\u0306 \u0410, \u0401, \u0419
\u304b\u3099 \u304c \u304b\u3099 \u304c
Henry IV Henry IV Henry IV Henry IV Henry IV
Henry Ⅳ Henry\u2163 Henry\u2163 Henry IV Henry IV

Viết hai chiều

Chuẩn Unicode hỗ trợ các ngôn ngữ viết theo cả hai hướng viết từ trái sang phải. từ trái sang phải, LTR) và viết từ phải sang trái (tiếng Anh. từ phải sang trái, RTL) - ví dụ: chữ viết tiếng Ả Rập và tiếng Do Thái. Trong cả hai trường hợp, các ký tự được lưu trữ theo thứ tự "tự nhiên"; màn hình hiển thị của chúng có tính đến hướng viết mong muốn được cung cấp bởi ứng dụng.

Ngoài ra, Unicode còn hỗ trợ các văn bản kết hợp, kết hợp các đoạn văn bản với các hướng viết khác nhau. Tính năng này được gọi là tính hai chiều(Tiếng Anh) văn bản hai chiều, BiDi). Một số trình kết xuất văn bản nhẹ (chẳng hạn như trong điện thoại di động) có thể hỗ trợ Unicode nhưng không hỗ trợ tính năng hai chiều. Tất cả các ký tự Unicode được chia thành nhiều loại: ký tự được viết từ trái sang phải, ký tự được viết từ phải sang trái và ký tự được viết theo bất kỳ hướng nào. Loại ký tự cuối cùng (chủ yếu là dấu chấm câu) mang hướng của văn bản xung quanh khi hiển thị.

Nhân vật nổi bật

Unicode bao gồm hầu như tất cả các tập lệnh hiện đại, bao gồm:

và những người khác.

Nhiều chữ viết lịch sử đã được thêm vào cho mục đích học thuật, bao gồm: chữ rune, chữ tượng hình Hy Lạp cổ, chữ tượng hình Ai Cập, chữ hình nêm, chữ viết Maya, bảng chữ cái Etruscan.

Unicode cung cấp một loạt các ký hiệu và chữ tượng hình toán học và âm nhạc.

Tuy nhiên, Unicode thường không bao gồm logo công ty và sản phẩm, mặc dù chúng xuất hiện dưới dạng phông chữ (ví dụ: logo Apple trong MacRoman (0xF0) hoặc logo Windows trong Wingdings (0xFF)). Trong phông chữ Unicode, logo chỉ nên được đặt trong vùng ký tự tùy chỉnh.

ISO/IEC 10646

Hiệp hội Unicode hợp tác chặt chẽ với nhóm công tác ISO/IEC/JTC1/SC2/WG2 đang phát triển Tiêu chuẩn quốc tế 10646 (ISO/IEC 10646). Có sự đồng bộ giữa tiêu chuẩn Unicode và ISO/IEC 10646, mặc dù mỗi tiêu chuẩn sử dụng hệ thống thuật ngữ và tài liệu riêng.

Sự hợp tác giữa Hiệp hội Unicode và Tổ chức Tiêu chuẩn hóa Quốc tế. Tổ chức Tiêu chuẩn hóa Quốc tế, ISO ) bắt đầu vào năm 1991. Năm 1993, ISO ban hành tiêu chuẩn DIS 10646.1. Để đồng bộ hóa với nó, Hiệp hội đã phê duyệt phiên bản tiêu chuẩn Unicode 1.1, bao gồm các ký tự bổ sung từ DIS 10646.1. Kết quả là ý nghĩa của các ký tự được mã hóa trong Unicode 1.1 và DIS 10646.1 hoàn toàn trùng khớp.

Sau đó, sự hợp tác giữa hai tổ chức vẫn tiếp tục. Năm 2000, chuẩn Unicode 3.0 được đồng bộ với ISO/IEC 10646-1:2000. Phiên bản thứ ba sắp tới của ISO/IEC 10646 sẽ được đồng bộ với Unicode 4.0. Có lẽ những thông số kỹ thuật này thậm chí sẽ được công bố dưới dạng một tiêu chuẩn duy nhất.

Tương tự như các định dạng UTF-16 và UTF-32 trong chuẩn Unicode, chuẩn ISO/IEC 10646 cũng có 2 dạng mã hóa ký tự cơ bản là UCS-2 (2 byte mỗi ký tự, tương tự UTF-16) và UCS-4 (4 byte cho mỗi ký tự, tương tự UTF-32). UCS có nghĩa là đa octet phổ quát(nhiều byte) bộ ký tự được mã hóa(Tiếng Anh) bộ ký tự được mã hóa nhiều octet phổ quát ). UCS-2 có thể được coi là tập hợp con của UTF-16 (UTF-16 không có cặp thay thế) và UCS-4 là từ đồng nghĩa với UTF-32.

Phương pháp trình bày

Unicode có một số hình thức biểu diễn. Định dạng chuyển đổi Unicode, UTF ): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) và UTF-32 (UTF-32BE, UTF-32LE). Một dạng biểu diễn UTF-7 để truyền qua các kênh bảy bit cũng đã được phát triển, nhưng do không tương thích với ASCII nên nó không được sử dụng rộng rãi và không được đưa vào tiêu chuẩn. Vào ngày 1 tháng 4 năm 2005, hai hình thức thể hiện hài hước đã được đề xuất: UTF-9 và UTF-18 (RFC 4042).

Unicode UTF-8: 0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0 x00 1FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Về mặt lý thuyết là có thể, nhưng cũng không có trong tiêu chuẩn:

0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Mặc dù UTF-8 cho phép bạn chỉ định cùng một ký tự theo nhiều cách nhưng chỉ cách ngắn nhất là đúng. Các hình thức khác nên bị từ chối vì lý do bảo mật.

Thứ tự byte

Trong luồng dữ liệu UTF-16, byte cao có thể được ghi trước byte thấp. UTF-16 lớn hơn), hoặc sau đứa trẻ (tiếng Anh) UTF-16 nhỏ cuối). Tương tự, có hai tùy chọn để mã hóa bốn byte - UTF-32BE và UTF-32LE.

Để xác định định dạng biểu diễn Unicode, một chữ ký được ghi vào đầu tệp văn bản - ký tự U+FEFF (dấu cách không có độ rộng bằng 0), còn được gọi là dấu thứ tự byte(Tiếng Anh) dấu thứ tự byte, BOM ). Điều này giúp có thể phân biệt giữa UTF-16LE và UTF-16BE vì ký tự U+FFFE không tồn tại. Phương pháp này đôi khi cũng được sử dụng để biểu thị định dạng UTF-8, mặc dù khái niệm thứ tự byte không áp dụng được cho định dạng này. Các tệp theo quy ước này bắt đầu bằng các chuỗi byte sau:

UTF-8 EF BB BF UTF-16BE FE FF UTF-16LE FF FE UTF-32BE 00 00 FE FF UTF-32LE FF FE 00 00

Thật không may, phương pháp này không phân biệt được giữa UTF-16LE và UTF-32LE một cách đáng tin cậy, vì ký tự U+0000 được Unicode cho phép (mặc dù văn bản thực hiếm khi bắt đầu bằng nó).

Các tệp được mã hóa UTF-16 và UTF-32 không chứa BOM phải ở thứ tự byte lớn (unicode.org).

Mã hóa Unicode và truyền thống

Sự ra đời của Unicode đã dẫn đến sự thay đổi trong cách tiếp cận mã hóa 8 bit truyền thống. Nếu trước đó mã hóa được chỉ định bởi phông chữ thì bây giờ nó được chỉ định bởi một bảng tương ứng giữa mã hóa đã cho và Unicode. Trên thực tế, mã hóa 8 bit đã trở thành một dạng biểu diễn cho một tập hợp con Unicode. Điều này giúp việc tạo các chương trình cần làm việc với nhiều bảng mã khác nhau trở nên dễ dàng hơn nhiều: giờ đây, để thêm hỗ trợ cho một bảng mã khác, bạn chỉ cần thêm một bảng chuyển đổi Unicode khác.

Ngoài ra, nhiều định dạng dữ liệu cho phép bạn chèn bất kỳ ký tự Unicode nào, ngay cả khi tài liệu được viết bằng mã hóa 8 bit cũ. Ví dụ: trong HTML bạn có thể sử dụng mã có ký hiệu.

Triển khai

Hầu hết các hệ điều hành hiện đại đều cung cấp một số mức độ hỗ trợ Unicode.

Một trong những triển khai thương mại thành công đầu tiên của Unicode là môi trường lập trình Java. Về cơ bản, nó đã từ bỏ việc thể hiện các ký tự 8 bit để chuyển sang 16 bit. Hầu hết các ngôn ngữ lập trình hiện nay đều hỗ trợ chuỗi Unicode, mặc dù cách biểu diễn của chúng có thể khác nhau tùy theo cách triển khai.

Phương thức nhập

Bảng điều khiển GNU/Linux cũng cho phép bạn nhập ký tự Unicode bằng mã của nó - để thực hiện việc này, mã thập phân của ký tự phải được nhập bằng cách sử dụng các số của khối bàn phím mở rộng trong khi giữ phím Alt. Bạn có thể nhập các ký tự theo mã thập lục phân của chúng: để thực hiện việc này, bạn cần giữ phím AltGr và để nhập các số từ A đến F, hãy sử dụng các phím khối bàn phím mở rộng từ NumLock đến Enter (theo chiều kim đồng hồ). Đầu vào theo tiêu chuẩn ISO 14755 cũng được hỗ trợ, để các phương thức trên hoạt động, bạn cần bật chế độ Unicode trong bảng điều khiển bằng cách gọi unicode_start (1) và chọn phông chữ thích hợp bằng cách gọi setfont (8).

Cách đánh vần "Unicode" đã được thiết lập vững chắc trong các văn bản tiếng Nga. Theo Yandex, tần suất sử dụng từ này cao hơn Unicode khoảng 11 lần. Wikipedia sử dụng phiên bản phổ biến hơn.

Trang web của Consortium có một trang đặc biệt thảo luận về các vấn đề truyền tải từ “Unicode” bằng nhiều ngôn ngữ và hệ thống chữ viết khác nhau. Đối với bảng chữ cái Cyrillic của Nga, tùy chọn "Unicode" được chỉ định.

Các hình thức được các tổ chức nước ngoài áp dụng cho bản dịch tiếng Nga của từ “Unicode” mang tính chất tư vấn.

Xem thêm

  • Dự án: Đưa các ký hiệu bảng chữ cái của các dân tộc Nga sang Unicode

Ghi chú

  1. Phiên âm Unicode (tiếng Anh). Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 10 tháng 5 năm 2010.
  2. Unicode trong từ điển Paratype
  3. Tiêu chuẩn Unicode®: Giới thiệu kỹ thuật. Đã lưu trữ
  4. Lịch sử ngày phát hành và xuất bản Unicode. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 4 tháng 7 năm 2010.
  5. Hiệp hội Unicode. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 4 tháng 7 năm 2010.
  6. Lời tựa. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 4 tháng 7 năm 2010.
  7. Cấu trúc chung. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 5 tháng 7 năm 2010.
  8. Hệ thống chữ cái châu Âu. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 4 tháng 7 năm 2010.
  9. Unicode88. Bản gốc lưu trữ ngày 22 tháng 8 năm 2011. Truy cập ngày 8 tháng 7 năm 2010.
  10. Unicode và Microsoft Windows NT (tiếng Anh). Hỗ trợ của Microsoft. Đã lưu trữ
  11. Unicode được sử dụng trên gần 50% trang web (tiếng Nga). Bản gốc lưu trữ ngày 22 tháng 8 năm 2011.
  12. Lộ trình đến TIP (Mặt phẳng tư tưởng cấp ba)
  13. http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt (tiếng Anh)
  14. Trường hợp Unicode không dễ dàng
  15. Hầu hết các phông chữ PC đều triển khai các chữ số đơn cách "chữ hoa" (majuscule).
  16. Trong một số trường hợp, một tài liệu (không phải văn bản thuần túy) bằng Unicode có thể chiếm ít dung lượng hơn đáng kể so với tài liệu ở dạng mã hóa một byte. Ví dụ: nếu một trang web nhất định chứa số lượng văn bản tiếng Nga và tiếng Hy Lạp xấp xỉ bằng nhau, thì trong mã hóa một byte, bạn sẽ phải viết các chữ cái tiếng Nga hoặc tiếng Hy Lạp, sử dụng các khả năng của định dạng tài liệu, dưới dạng mã với một ký hiệu, chiếm 6-7 byte cho mỗi ký tự (khi sử dụng mã thập phân), tức là trung bình, một chữ cái sẽ chiếm 3,5-4 byte, trong khi UTF-8 chỉ mất 2 byte cho mỗi chữ cái tiếng Hy Lạp hoặc tiếng Nga.
  17. Một trong các tệp phông chữ Arial Unicode có kích thước 24 megabyte; Có một tờ Times New Roman có kích thước 120 megabyte và chứa gần 65.536 ký tự.
  18. Ngay cả đối với điện thoại di động hiện đại và đắt tiền nhất cũng khó phân bổ bộ nhớ 120 MB cho phông chữ Unicode đầy đủ. Trong thực tế, việc sử dụng phông chữ đầy đủ hiếm khi được yêu cầu.
  19. 350 nghìn trang “Unicode” so với 31 nghìn trang “Unicode”.

Liên kết

  • Trang web chính thức của Hiệp hội Unicode (tiếng Anh)
  • bảng mã Unicode trong thư mục liên kết Dự án Thư mục Mở (dmoz). (Tiếng Anh)
  • Unicode là gì? (Tiếng Nga)
  • Phiên bản mới nhất

Unicode hoặc Unicode (từ tiếng Anh bảng mã Unicode) là một tiêu chuẩn mã hóa ký tự. Nó giúp hầu hết tất cả các ngôn ngữ viết đều có thể được thể hiện dưới dạng mã hóa.

Vào cuối những năm 1980, vai trò của tiêu chuẩn được gán cho các ký tự 8 bit. Mã hóa 8 bit được thể hiện bằng nhiều sửa đổi khác nhau, số lượng không ngừng tăng lên. Đây chủ yếu là kết quả của việc tích cực mở rộng phạm vi ngôn ngữ được sử dụng. Các nhà phát triển cũng mong muốn đưa ra một loại mã hóa có thể khẳng định ít nhất một phần tính phổ biến.

Kết quả là, nó trở nên cần thiết để giải quyết một số vấn đề:

  • Sự cố khi hiển thị tài liệu ở dạng mã hóa không chính xác. Nó có thể được giải quyết bằng cách giới thiệu một cách nhất quán các phương pháp chỉ định mã hóa được sử dụng hoặc bằng cách giới thiệu một mã hóa duy nhất cho mọi người;
  • các vấn đề về gói ký tự hạn chế, có thể được giải quyết bằng cách chuyển đổi phông chữ trong tài liệu hoặc bằng cách giới thiệu mã hóa mở rộng;
  • vấn đề chuyển đổi mã hóa từ mã này sang mã hóa khác, dường như có thể giải quyết bằng cách sử dụng chuyển đổi trung gian (mã hóa thứ ba), bao gồm các ký tự từ các mã hóa khác nhau hoặc bằng cách biên dịch các bảng chuyển đổi cho từng mã hóa;
  • vấn đề trùng lặp các phông chữ riêng lẻ. Theo truyền thống, mỗi bảng mã giả định sự hiện diện của phông chữ riêng, ngay cả khi các bảng mã trùng khớp hoàn toàn hoặc một phần trong bộ ký tự. Ở một mức độ nào đó, vấn đề đã được giải quyết nhờ sự trợ giúp của các phông chữ “lớn”, từ đó các ký tự cần thiết cho một mã hóa cụ thể sẽ được chọn. Nhưng để xác định mức độ tuân thủ, cần phải tạo ra một cơ quan đăng ký thống nhất các ký hiệu.

Vì vậy, câu hỏi về sự cần thiết phải tạo ra một mã hóa thống nhất “rộng” đã được đưa vào chương trình nghị sự. Các bảng mã ký tự có thể thay đổi được sử dụng ở Đông Nam Á dường như quá khó sử dụng. Do đó, người ta nhấn mạnh vào việc sử dụng ký tự có chiều rộng cố định. Các ký tự 32 bit có vẻ quá cồng kềnh và cuối cùng các ký tự 16 bit đã giành chiến thắng.

Tiêu chuẩn này được đề xuất tới cộng đồng Internet vào năm 1991 bởi một tổ chức phi lợi nhuận "Tập đoàn Unicode". Việc sử dụng nó giúp mã hóa một số lượng lớn các ký tự của các loại văn bản khác nhau. Trong các tài liệu Unicode, cả ký tự tiếng Trung, ký hiệu toán học, bảng chữ cái Cyrillic hay bảng chữ cái Latinh đều không gần nhau. Trong trường hợp này, các trang mã không yêu cầu bất kỳ chuyển đổi nào trong quá trình hoạt động.

Tiêu chuẩn này bao gồm hai phần chính: bộ ký tự phổ quát (UCS) và họ mã hóa (UTF bằng tiếng Anh). Bộ ký tự chung đặt tỷ lệ duy nhất cho mã ký tự. Các mã trong trường hợp này là các phần tử của phạm vi mã, là các số nguyên không âm. Chức năng của họ mã hóa là xác định cách biểu diễn máy của một chuỗi mã UCS.

Trong tiêu chuẩn Unicode, mã được phân loại thành nhiều khu vực. Mã vùng từ U+0000 đến U+007F bao gồm các ký tự ASCII với các mã được yêu cầu. Hơn nữa, có các khu vực ký hiệu của các chữ viết khác nhau, ký hiệu kỹ thuật và dấu chấm câu. Một loạt mã riêng biệt được lưu giữ để sử dụng trong tương lai. Các vùng ký tự có mã sau đây được xác định cho bảng chữ cái Cyrillic: U+0400 - U+052F, U+2DE0 - U+2DFF, U+A640 - U+A69F.

Tầm quan trọng của mã hóa này trong không gian web ngày càng tăng lên. Tỷ lệ các trang web sử dụng Unicode là gần 50% vào đầu năm 2010.

Unicode là một thế giới rất rộng lớn và phức tạp, bởi vì tiêu chuẩn này cho phép bạn biểu diễn và làm việc trên một máy tính với tất cả các tập lệnh chính của thế giới. Một số hệ thống chữ viết đã tồn tại hơn một nghìn năm, trong đó nhiều hệ thống trong số đó phát triển gần như độc lập với nhau ở những nơi khác nhau trên thế giới. Mọi người đã nghĩ ra rất nhiều thứ và chúng thường khác nhau đến mức việc kết hợp tất cả chúng thành một tiêu chuẩn duy nhất là một nhiệm vụ cực kỳ khó khăn và đầy tham vọng.

Để thực sự hiểu Unicode, ít nhất bạn cần có hiểu biết sơ sài về các tính năng của tất cả các tập lệnh mà tiêu chuẩn này cho phép bạn làm việc. Nhưng đây có phải là điều mà mọi nhà phát triển đều cần? Chúng tôi sẽ nói không. Để sử dụng Unicode cho hầu hết các công việc hàng ngày, chỉ cần biết kiến ​​​​thức tối thiểu hợp lý và sau đó đi sâu vào tiêu chuẩn nếu cần.

Trong bài viết này, chúng tôi sẽ nói về các nguyên tắc cơ bản của Unicode và nêu bật những vấn đề thực tế quan trọng mà các nhà phát triển chắc chắn sẽ gặp phải trong công việc hàng ngày của họ.

Tại sao cần có Unicode?

Trước khi Unicode ra đời, mã hóa một byte hầu như được sử dụng phổ biến, trong đó ranh giới giữa các ký tự, cách biểu diễn của chúng trong bộ nhớ máy tính và hiển thị trên màn hình là khá tùy ý. Nếu bạn làm việc với một hoặc một ngôn ngữ quốc gia khác, thì các phông chữ mã hóa tương ứng đã được cài đặt trong hệ thống của bạn, cho phép bạn vẽ byte từ đĩa lên màn hình theo cách mà chúng có ý nghĩa đối với người dùng.

Nếu bạn đang in một tệp văn bản trên máy in và thấy trên trang giấy có nhiều dòng chữ vô nghĩa khó hiểu, điều này có nghĩa là các phông chữ thích hợp không được tải vào thiết bị in và nó không diễn giải các byte theo cách bạn muốn.

Cách tiếp cận này nói chung và mã hóa từng byte nói riêng có một số nhược điểm đáng kể:

  1. Có thể làm việc đồng thời chỉ với 256 ký tự, trong đó 128 ký tự đầu tiên được dành cho ký tự Latinh và ký tự điều khiển, và trong nửa sau, ngoài các ký hiệu của bảng chữ cái quốc gia, cần phải tìm một vị trí cho các ký hiệu giả ( ╔ ╗).
  2. Phông chữ được gắn với một mã hóa cụ thể.
  3. Mỗi mã hóa đại diện cho bộ ký tự riêng của nó và việc chuyển đổi từ mã này sang mã khác chỉ có thể bị mất một phần khi các ký tự bị thiếu được thay thế bằng các ký tự tương tự về mặt đồ họa.
  4. Việc chuyển tập tin giữa các thiết bị chạy hệ điều hành khác nhau rất khó khăn. Bạn phải có chương trình chuyển đổi hoặc mang theo các phông chữ bổ sung cùng với tệp. Sự tồn tại của Internet như chúng ta biết là không thể.
  5. Trên thế giới có những hệ thống chữ viết không phải chữ cái (chữ tượng hình), về nguyên tắc không thể biểu diễn bằng mã hóa một byte.

Nguyên tắc cơ bản của Unicode

Tất cả chúng ta đều hiểu rất rõ rằng máy tính không biết về bất kỳ thực thể lý tưởng nào mà hoạt động bằng bit và byte. Nhưng hệ thống máy tính vẫn được tạo ra bởi con người chứ không phải máy móc, và đối với bạn và tôi, đôi khi sẽ thuận tiện hơn khi vận hành với những khái niệm suy đoán, rồi đi từ trừu tượng đến cụ thể.

Quan trọng! Một trong những nguyên tắc trung tâm trong triết lý Unicode là sự phân biệt rõ ràng giữa các ký tự, cách thể hiện chúng trong máy tính và cách hiển thị của chúng trên thiết bị đầu ra.

Khái niệm ký tự Unicode trừu tượng được giới thiệu, tồn tại duy nhất dưới dạng khái niệm suy đoán và thỏa thuận giữa mọi người, được quy định trong tiêu chuẩn. Mỗi ký tự Unicode được liên kết với một số nguyên không âm gọi là điểm mã của nó.

Ví dụ: ký tự Unicode U+041F là chữ cái Cyrillic viết hoa P. Có một số cách để thể hiện ký tự này trong bộ nhớ máy tính, giống như có hàng nghìn cách để hiển thị nó trên màn hình điều khiển. Nhưng đồng thời P, nó cũng sẽ là P hoặc U+041F ở Châu Phi.

Đây là cách đóng gói hoặc tách giao diện quen thuộc khỏi quá trình triển khai - một khái niệm đã được chứng minh là tốt trong lập trình.

Hóa ra, theo hướng dẫn của tiêu chuẩn, bất kỳ văn bản nào cũng có thể được mã hóa dưới dạng một chuỗi ký tự Unicode

Xin chào U+041F U+0440 U+0438 U+0432 U+0435 U+0442
viết nó ra một tờ giấy, gói nó trong một phong bì và gửi nó đến bất kỳ nơi nào trên thế giới. Nếu họ biết về sự tồn tại của Unicode, thì văn bản sẽ được họ cảm nhận giống hệt như bạn và tôi. Họ sẽ không có chút nghi ngờ nào rằng ký tự áp chót là chữ thường Cyrillic e(U+0435), và không nói tiếng Latin nhỏ e(U+0065). Lưu ý rằng chúng tôi chưa nói một lời nào về cách biểu diễn byte.

Mặc dù các ký tự Unicode được gọi là ký hiệu nhưng chúng không phải lúc nào cũng tương ứng với một ký hiệu theo nghĩa truyền thống, chẳng hạn như chữ cái, số, dấu chấm câu hoặc chữ tượng hình. (Xem spoiler để biết thêm chi tiết.)

Ví dụ về các ký tự Unicode khác nhau

Ví dụ: có các ký tự Unicode thuần túy kỹ thuật:

  • U+0000: ký tự rỗng;
  • U+D800–U+DFFF: các đại diện thay thế phụ và chính để biểu diễn kỹ thuật các điểm mã trong phạm vi từ 10000 đến 10FFFF (đọc: bên ngoài BML/BMP) trong họ mã hóa UTF-16;
  • vân vân.
Có dấu chấm câu, ví dụ U+200F: dấu để thay đổi hướng viết từ phải sang trái.

Có cả một nhóm không gian có chiều rộng và mục đích khác nhau (xem bài viết habra xuất sắc :):

  • U+0020 (dấu cách);
  • U+00A0 (dấu cách không ngắt, trong HTML);
  • U+2002 (nhúng hình bán nguyệt hoặc En Space);
  • U+2003 (nhúng hoặc Em Space);
  • vân vân.
Có sự kết hợp của các dấu phụ - tất cả các loại nét, dấu chấm, dấu ngã, v.v., làm thay đổi/làm rõ ý nghĩa của dấu hiệu trước đó và kiểu dáng của nó. Ví dụ:
  • U+0300 và U+0301: dấu hiệu stress sơ cấp (cấp tính) và stress thứ cấp (yếu);
  • U+0306: viết tắt (chỉ số trên), như trong th;
  • U+0303: dấu ngã siêu ký tự;
  • vân vân.
Thậm chí còn có thứ gì đó kỳ lạ như thẻ ngôn ngữ (U+E0001, U+E0020–U+E007E và U+E007F), hiện đang trong tình trạng lấp lửng. Chúng nhằm mục đích đánh dấu các phần văn bản nhất định thuộc về một biến thể ngôn ngữ cụ thể (chẳng hạn như tiếng Anh Mỹ và tiếng Anh Anh), điều này có thể ảnh hưởng đến chi tiết về cách hiển thị văn bản.

Lần sau chúng tôi sẽ cho bạn biết ký hiệu là gì, cụm biểu đồ (đọc: được coi là một hình ảnh duy nhất của ký hiệu) khác với ký hiệu Unicode và lượng tử mã như thế nào.

Không gian mã Unicode

Không gian mã Unicode bao gồm 1.114.112 vị trí mã nằm trong khoảng từ 0 đến 10FFFF. Trong số này, chỉ có 128.237 được gán giá trị cho phiên bản thứ 9. Một số không gian được dành riêng cho mục đích sử dụng cá nhân và Hiệp hội Unicode hứa sẽ không bao giờ gán giá trị cho các vị trí trong các khu vực đặc biệt này.

Để thuận tiện, toàn bộ không gian được chia thành 17 mặt phẳng (sáu trong số đó hiện đang được sử dụng). Cho đến gần đây, người ta thường nói rằng rất có thể bạn sẽ chỉ gặp Mặt phẳng đa ngôn ngữ cơ bản (BMP), bao gồm các ký tự Unicode từ U+0000 đến U+FFFF. (Nhìn về phía trước một chút: các ký tự từ BMP được biểu thị bằng UTF-16 bằng hai byte chứ không phải bốn). Vào năm 2016, luận điểm này đã bị nghi ngờ. Ví dụ: các ký tự Emoji phổ biến cũng có thể xuất hiện trong tin nhắn của người dùng và bạn cần có khả năng xử lý chúng một cách chính xác.

Mã hóa

Nếu chúng ta muốn gửi văn bản qua Internet, chúng ta sẽ cần mã hóa một chuỗi ký tự Unicode thành một chuỗi byte.

Tiêu chuẩn Unicode bao gồm mô tả về một số bảng mã Unicode, chẳng hạn như UTF-8 và UTF-16BE/UTF-16LE, cho phép mã hóa toàn bộ không gian ký tự. Việc chuyển đổi giữa các bảng mã này có thể được thực hiện tự do mà không làm mất thông tin.

Ngoài ra, không ai hủy bỏ mã hóa một byte, nhưng chúng cho phép bạn mã hóa phần phổ Unicode riêng và rất hẹp của riêng bạn - 256 vị trí mã trở xuống. Đối với các mã hóa như vậy, các bảng tồn tại và có sẵn cho tất cả mọi người, trong đó mỗi giá trị của một byte đơn được liên kết với một ký tự Unicode (ví dụ: xem CP1251.TXT). Bất chấp những hạn chế, mã hóa một byte tỏ ra rất thực tế khi làm việc với một lượng lớn thông tin văn bản đơn ngữ.

Trong số các bảng mã Unicode, phổ biến nhất trên Internet là UTF-8 (nó đã giành được giải thưởng năm 2008), chủ yếu là do tính hiệu quả và khả năng tương thích rõ ràng với ASCII bảy bit. Ký tự Latinh và dịch vụ, dấu câu và số cơ bản - tức là tất cả các ký tự ASCII bảy bit được mã hóa bằng UTF-8 dưới dạng một byte, giống như trong ASCII. Các ký tự của nhiều hệ thống chữ viết chính, không kể một số ký tự chữ tượng hình hiếm hơn, được biểu thị bằng hai hoặc ba byte. Vị trí mã lớn nhất được xác định theo tiêu chuẩn, 10FFFF, được mã hóa thành bốn byte.

Xin lưu ý rằng UTF-8 là mã hóa có độ dài mã thay đổi. Mỗi ký tự Unicode trong đó được biểu thị bằng một chuỗi lượng tử mã có độ dài tối thiểu là một lượng tử. Số 8 nghĩa là độ dài bit của đơn vị mã (code unit) - 8 bit. Đối với họ mã hóa UTF-16, kích thước của lượng tử mã tương ứng là 16 bit. Đối với UTF-32 - 32 bit.

Nếu bạn đang gửi một trang HTML có văn bản Cyrillic qua mạng thì UTF-8 có thể mang lại lợi ích rất đáng kể, bởi vì tất cả đánh dấu, cũng như các khối JavaScript và CSS, sẽ được mã hóa hiệu quả thành một byte. Ví dụ: trang chính của Habr ở UTF-8 chiếm 139Kb, còn ở UTF-16 thì đã là 256Kb. Để so sánh, nếu bạn dùng win-1251 mà mất khả năng lưu một số ký tự thì kích thước so với UTF-8 sẽ giảm chỉ 11Kb xuống còn 128Kb.

Để lưu trữ thông tin chuỗi trong các ứng dụng, mã hóa Unicode 16 bit thường được sử dụng do tính đơn giản của chúng, cũng như thực tế là các ký tự của các hệ thống chữ viết chính trên thế giới được mã hóa theo lượng tử 16 bit. Ví dụ: Java sử dụng thành công UTF-16 để biểu diễn chuỗi bên trong. Hệ điều hành Windows cũng sử dụng UTF-16 nội bộ.

Trong mọi trường hợp, miễn là chúng ta vẫn ở trong không gian Unicode, việc thông tin chuỗi được lưu trữ như thế nào trong một ứng dụng riêng lẻ không thực sự quan trọng. Nếu định dạng bộ nhớ trong cho phép bạn mã hóa chính xác tất cả hàng triệu vị trí mã và không bị mất thông tin ở ranh giới ứng dụng, chẳng hạn như khi đọc từ tệp hoặc sao chép vào bảng tạm, thì mọi thứ đều ổn.

Để diễn giải chính xác văn bản được đọc từ đĩa hoặc từ ổ cắm mạng, trước tiên bạn phải xác định mã hóa của nó. Điều này được thực hiện bằng cách sử dụng siêu thông tin do người dùng cung cấp, được viết trong hoặc liền kề với văn bản hoặc được xác định theo phương pháp phỏng đoán.

Điểm mấu chốt

Có rất nhiều thông tin và thật hợp lý khi đưa ra một bản tóm tắt ngắn gọn về mọi thứ đã được viết ở trên:
  • Unicode quy định sự phân biệt rõ ràng giữa các ký tự, cách biểu diễn chúng trong máy tính và cách hiển thị của chúng trên thiết bị đầu ra.
  • Các ký tự Unicode không phải lúc nào cũng tương ứng với một ký tự theo nghĩa truyền thống, chẳng hạn như chữ cái, số, dấu chấm câu hoặc chữ tượng hình.
  • Không gian mã Unicode bao gồm 1.114.112 vị trí mã nằm trong khoảng từ 0 đến 10FFFF.
  • Mặt phẳng đa ngôn ngữ cơ bản bao gồm các ký tự Unicode từ U+0000 đến U+FFFF, được mã hóa bằng UTF-16 dưới dạng hai byte.
  • Bất kỳ mã hóa Unicode nào cũng cho phép bạn mã hóa toàn bộ không gian của các vị trí mã Unicode và việc chuyển đổi giữa các mã hóa khác nhau được thực hiện mà không làm mất thông tin.
  • Mã hóa một byte chỉ cho phép mã hóa một phần nhỏ phổ Unicode, nhưng có thể hữu ích khi làm việc với lượng lớn thông tin đơn ngữ.
  • Mã hóa UTF-8 và UTF-16 có độ dài mã thay đổi. Trong UTF-8, mỗi ký tự Unicode có thể được mã hóa thành một, hai, ba hoặc bốn byte. Trong UTF-16 - hai hoặc bốn byte.
  • Định dạng nội bộ để lưu trữ thông tin văn bản trong một ứng dụng riêng biệt có thể tùy ý, miễn là nó hoạt động chính xác với toàn bộ không gian của các vị trí mã Unicode và không bị mất mát trong quá trình truyền dữ liệu xuyên biên giới.

Lưu ý nhanh về mã hóa

Có thể có một số nhầm lẫn với thuật ngữ mã hóa. Trong Unicode, mã hóa xảy ra hai lần. Lần đầu tiên một bộ ký tự Unicode được mã hóa, nghĩa là mỗi ký tự Unicode được gán một vị trí mã tương ứng. Quá trình này biến bộ ký tự Unicode thành bộ ký tự được mã hóa. Lần thứ hai, chuỗi ký tự Unicode được chuyển đổi thành chuỗi byte và quá trình này còn được gọi là mã hóa.

Trong thuật ngữ tiếng Anh, có hai động từ khác nhau, mã hóa và mã hóa, nhưng ngay cả người bản xứ cũng thường nhầm lẫn với chúng. Ngoài ra, thuật ngữ bộ ký tự hoặc bộ ký tự được sử dụng làm từ đồng nghĩa với thuật ngữ bộ ký tự được mã hóa.

Chúng tôi nói tất cả những điều này với thực tế là việc chú ý đến ngữ cảnh và phân biệt giữa các tình huống khi chúng ta nói về vị trí mã của một ký tự Unicode trừu tượng và khi chúng ta nói về cách biểu diễn byte của nó là điều hợp lý.

Cuối cùng

Có rất nhiều khía cạnh khác nhau của Unicode đến mức không thể trình bày hết mọi thứ trong một bài viết. Và nó không cần thiết. Thông tin trên đủ để tránh nhầm lẫn về các nguyên tắc cơ bản và làm việc với văn bản trong hầu hết các công việc hàng ngày (đọc: không vượt quá BMP). Trong các bài viết sau, chúng tôi sẽ nói về việc chuẩn hóa, đưa ra một cái nhìn tổng quan lịch sử đầy đủ hơn về sự phát triển của mã hóa, nói về các vấn đề của thuật ngữ Unicode tiếng Nga, đồng thời cung cấp tài liệu về các khía cạnh thực tế của việc sử dụng UTF-8 và UTF-16 .

Unicode là tiêu chuẩn mã hóa ký tự quốc tế cho phép văn bản được hiển thị nhất quán trên bất kỳ máy tính nào trên thế giới, bất kể ngôn ngữ hệ thống mà nó sử dụng.

Khái niệm cơ bản

Để hiểu bảng ký tự Unicode dùng để làm gì, trước tiên chúng ta hãy tìm hiểu cơ chế hiển thị văn bản trên màn hình điều khiển. Một máy tính, như chúng ta biết, xử lý tất cả thông tin ở dạng kỹ thuật số và phải hiển thị nó bằng đồ họa để con người nhận thức chính xác. Vì vậy, để đọc được văn bản này, chúng ta cần giải quyết ít nhất hai vấn đề:

  • Mã hóa các ký tự in thành dạng kỹ thuật số.
  • Cung cấp cho hệ điều hành khả năng khớp dạng kỹ thuật số với các ký tự vectơ, nói cách khác là tìm các chữ cái chính xác.

Mã hóa đầu tiên

ASCII của Mỹ được coi là tổ tiên của tất cả các bảng mã. Nó mô tả bảng chữ cái Latinh với các dấu chấm câu và chữ số Ả Rập được sử dụng trong tiếng Anh. Chính 128 ký tự được sử dụng trong đó đã trở thành nền tảng cho những phát triển tiếp theo - ngay cả bảng ký tự Unicode hiện đại cũng sử dụng chúng. Các chữ cái trong bảng chữ cái Latinh kể từ đó đã chiếm vị trí đầu tiên trong bất kỳ bảng mã nào.

Tổng cộng, ASCII cho phép lưu trữ 256 ký tự, nhưng vì 128 ký tự đầu tiên được chiếm giữ bởi bảng chữ cái Latinh nên 128 ký tự còn lại bắt đầu được sử dụng trên toàn thế giới để tạo ra các tiêu chuẩn quốc gia. Ví dụ: ở Nga, CP866 và KOI8-R đã được tạo ra trên cơ sở đó. Những biến thể như vậy được gọi là phiên bản mở rộng của ASCII.

Các trang mã và "krakozyabry"

Sự phát triển hơn nữa của công nghệ và sự xuất hiện của giao diện đồ họa đã dẫn đến việc tạo ra mã hóa ANSI bởi Viện Tiêu chuẩn Hoa Kỳ. Người dùng Nga, đặc biệt là những người có kinh nghiệm, biết phiên bản của nó là Windows 1251. Khái niệm “trang mã” lần đầu tiên được sử dụng trong đó. Với sự trợ giúp của các trang mã chứa các ký tự từ bảng chữ cái quốc gia ngoài tiếng Latin mà “sự hiểu biết lẫn nhau” đã được thiết lập giữa các máy tính được sử dụng ở các quốc gia khác nhau.

Tuy nhiên, sự hiện diện của một số lượng lớn các bảng mã khác nhau được sử dụng cho một ngôn ngữ bắt đầu gây ra vấn đề. Cái gọi là krakozyabrs đã xuất hiện. Chúng phát sinh từ sự khác biệt giữa trang mã nguồn nơi mọi thông tin được tạo và trang mã mặc định được sử dụng trên máy tính của người dùng cuối.

Để làm ví dụ, chúng ta có thể trích dẫn các bảng mã Cyrillic CP866 và KOI8-R ở trên. Các chữ cái trong đó khác nhau về vị trí mã và nguyên tắc sắp xếp. Trong phần đầu tiên, chúng được sắp xếp theo thứ tự bảng chữ cái và trong phần thứ hai - theo thứ tự ngẫu nhiên. Bạn có thể tưởng tượng điều gì đang xảy ra trước mắt người dùng khi cố mở một văn bản như vậy mà không có trang mã cần thiết hoặc khi nó được máy tính diễn giải không chính xác.

Sáng tạo Unicode

Sự phổ biến của Internet và các công nghệ liên quan, chẳng hạn như e-mail, đã dẫn đến thực tế là cuối cùng, tình trạng biến dạng văn bản không còn phù hợp với tất cả mọi người. Các công ty CNTT hàng đầu đã thành lập Hiệp hội Unicode. Bảng ký tự được ông giới thiệu năm 1991 có tên là UTF-32, có thể lưu trữ hơn một tỷ ký tự độc đáo. Đây là bước quan trọng nhất để giải mã các văn bản.

Tuy nhiên, bảng mã ký tự phổ biến đầu tiên, Unicode UTF-32, không được sử dụng rộng rãi. Lý do chính là sự dư thừa của thông tin được lưu trữ. Người ta nhanh chóng tính toán rằng đối với các quốc gia sử dụng bảng chữ cái Latinh được mã hóa bằng bảng phổ quát mới, văn bản sẽ chiếm dung lượng gấp bốn lần so với việc sử dụng bảng ASCII mở rộng.

Sự phát triển của Unicode

Bảng ký tự Unicode UTF-16 sau đây đã khắc phục sự cố này. Mã hóa trong đó được thực hiện với một nửa số bit, nhưng đồng thời số lượng kết hợp có thể giảm. Thay vì hàng tỷ ký tự, nó chỉ cho phép bạn lưu trữ 65.536. Tuy nhiên, nó thành công đến mức con số này, theo quyết định của Hiệp hội, được xác định là không gian lưu trữ cơ sở cho các ký tự chuẩn Unicode.

Bất chấp thành công này, UTF-16 không phù hợp với tất cả mọi người vì lượng thông tin được lưu trữ và truyền đi vẫn tăng gấp đôi. Giải pháp phổ biến là UTF-8, bảng ký tự Unicode có độ dài thay đổi. Đây có thể gọi là bước đột phá trong lĩnh vực này.

Vì vậy, với sự ra đời của hai tiêu chuẩn cuối cùng, bảng ký tự Unicode đã giải quyết được vấn đề về một không gian mã duy nhất cho tất cả các phông chữ hiện đang được sử dụng.

Unicode cho tiếng Nga

Do độ dài của mã được sử dụng để hiển thị các ký tự có thể thay đổi, bảng chữ cái Latinh được mã hóa bằng Unicode theo cách tương tự như ASCII tổ tiên của nó, nghĩa là trong một bit. Đối với các bảng chữ cái khác, hình ảnh có thể trông khác. Ví dụ: các ký tự trong bảng chữ cái Georgia sử dụng ba byte để mã hóa và các ký tự trong bảng chữ cái Cyrillic sử dụng hai byte. Tất cả điều này có thể thực hiện được trong khuôn khổ sử dụng tiêu chuẩn Unicode UTF-8 (bảng ký tự). Tiếng Nga hay bảng chữ cái Cyrillic chiếm 448 vị trí trong không gian mã chung, được chia thành năm khối.

Năm khối này bao gồm bảng chữ cái Cyrillic và Church Slavonic cơ bản, cũng như các chữ cái bổ sung từ các ngôn ngữ khác sử dụng bảng chữ cái Cyrillic. Một số vị trí đã được phân bổ để hiển thị các dạng biểu diễn chữ cái Cyrillic cũ và 22 vị trí trên tổng số vẫn còn trống.

Phiên bản hiện tại của Unicode

Với giải pháp cho nhiệm vụ chính của mình là chuẩn hóa phông chữ và tạo một không gian mã duy nhất cho chúng, Consortium đã không ngừng công việc của mình. Unicode không ngừng phát triển và mở rộng. Phiên bản hiện tại mới nhất của tiêu chuẩn này, 9.0, được phát hành vào năm 2016. Nó bao gồm sáu bảng chữ cái bổ sung và mở rộng danh sách biểu tượng cảm xúc được tiêu chuẩn hóa.

Phải nói rằng để đơn giản hóa việc nghiên cứu, ngay cả cái gọi là ngôn ngữ chết cũng được thêm vào Unicode. Họ nhận được tên này vì không có người nào là nguồn gốc của nó. Nhóm này cũng bao gồm các ngôn ngữ chỉ tồn tại ở thời đại chúng ta dưới dạng tượng đài bằng văn bản.

Về nguyên tắc, bất kỳ ai cũng có thể đăng ký để thêm các ký tự vào đặc tả Unicode mới. Đúng vậy, để làm được điều này, bạn sẽ phải điền một lượng tài liệu ban đầu kha khá và tốn rất nhiều thời gian. Một ví dụ sống động cho điều này là câu chuyện của lập trình viên Terence Eden. Năm 2013, ông đã nộp đơn xin đưa vào các ký hiệu đặc tả liên quan đến việc chỉ định các nút điều khiển nguồn máy tính. Chúng đã được sử dụng trong tài liệu kỹ thuật từ giữa những năm 70 của thế kỷ trước, nhưng không phải là một phần của Unicode cho đến khi đặc tả 9.0 ra đời.

bảng ký hiệu

Mọi máy tính, bất kể hệ điều hành được sử dụng, đều sử dụng bảng ký tự Unicode. Làm thế nào để sử dụng các bảng này, tìm chúng ở đâu và tại sao chúng có thể hữu ích cho người dùng bình thường?

Trong hệ điều hành Windows, bảng ký hiệu nằm trong phần menu “Tiện ích”. Trong họ hệ điều hành Linux, nó thường có thể được tìm thấy trong tiểu mục “Tiêu chuẩn” và trong MacOS, nó nằm trong cài đặt bàn phím. Mục đích chính của bảng này là nhập các ký tự không có trên bàn phím vào tài liệu văn bản.

Có thể tìm thấy phạm vi ứng dụng rộng nhất của các bảng như vậy: từ việc nhập các ký hiệu và biểu tượng kỹ thuật của hệ thống tiền tệ quốc gia đến viết hướng dẫn cách sử dụng thực tế các lá bài Tarot.

Cuối cùng

Unicode được sử dụng ở mọi nơi và đi vào cuộc sống của chúng ta cùng với sự phát triển của Internet và công nghệ di động. Nhờ sử dụng nó, hệ thống thông tin liên lạc giữa các dân tộc đã được đơn giản hóa đáng kể. Có thể nói rằng sự ra đời của Unicode là một ví dụ minh họa nhưng hoàn toàn vô hình từ bên ngoài về việc sử dụng công nghệ vì lợi ích chung của toàn nhân loại.