Mã hóa theo tiêu chuẩn Unicode quốc tế. Unicode trên web: Giới thiệu cho người mới bắt đầu

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 giới thiệ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ó làm cho nó có thể mã hóa một số lượng lớn nhân vật các loại khác nhau viết. 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.

Hôm nay chúng tôi sẽ nói chuyện với bạn về nguồn gốc của krakozyabrs trên một trang web và trong các chương trình, những mã hóa văn bản nào tồn tại và những mã nào nên được sử dụng. Chúng ta hãy xem xét kỹ hơn lịch sử phát triển của chúng, bắt đầu từ ASCII cơ bản, cũng như các phiên bản mở rộng CP866, KOI8-R, Windows 1251 và kết thúc bằng các mã hóa hiện đại của tập đoàn Unicode UTF 16 và 8.

  • Phiên bản mở rộng của mã hóa Asuka - CP866 và KOI8-R
  • Windows 1251 - Biến thể ASCII và lý do krakozyabry xuất hiện
Đối với một số người, thông tin này có vẻ không cần thiết, nhưng bạn có biết tôi nhận được bao nhiêu câu hỏi cụ thể liên quan đến krakozyabrs đang thu thập thông tin (bộ ký tự không thể đọc được). Bây giờ tôi sẽ có cơ hội để mọi người tham khảo nội dung bài viết này và tự tìm ra những sai sót của mình. Chà, hãy sẵn sàng tiếp thu thông tin và cố gắng theo dõi diễn biến của câu chuyện.

ASCII - mã hóa văn bản cơ bản cho bảng chữ cái Latinh

Sự phát triển của mã hóa văn bản xảy ra đồng thời với sự hình thành của ngành CNTT và trong thời gian này, chúng đã trải qua khá nhiều thay đổi. Trong lịch sử, tất cả đều bắt đầu với EBCDIC, một ngôn ngữ khá khác biệt trong cách phát âm tiếng Nga, giúp mã hóa các chữ cái trong bảng chữ cái Latinh, chữ số Ả Rập và dấu chấm câu bằng các ký tự điều khiển. Nhưng vẫn là điểm khởi đầu cho sự phát triển mã hóa hiện đại văn bản nên được coi là nổi tiếng ASCII (Tiêu chuẩn Mỹ Mã cho Trao đổi thông tin, trong tiếng Nga thường được phát âm là “aski”). Nó mô tả 128 ký tự đầu tiên được người dùng nói tiếng Anh sử dụng phổ biến nhất - chữ cái Latinh, chữ số Ả Rập và dấu chấm câu. 128 ký tự được mô tả trong ASCII này cũng bao gồm một số ký tự dịch vụ như dấu ngoặc, dấu thăng, dấu hoa thị, v.v. Trên thực tế, bạn có thể tự mình nhìn thấy chúng:
Chính 128 ký tự này từ phiên bản gốc của ASCII đã trở thành tiêu chuẩn và trong bất kỳ bảng mã nào khác, bạn chắc chắn sẽ tìm thấy chúng và chúng sẽ xuất hiện theo thứ tự này. Nhưng thực tế là với một byte thông tin, bạn có thể mã hóa không phải 128 mà lên tới 256 những nghĩa khác nhau(hai lũy thừa tám bằng 256), do đó phiên bản cơ bản Askey xuất hiện toàn bộ dòng mã hóa ASCII mở rộng, trong đó, ngoài 128 ký tự cơ bản, còn có thể mã hóa các ký hiệu của bảng mã quốc gia (ví dụ: tiếng Nga). Ở đây, có lẽ cần phải nói thêm một chút về hệ thống số được sử dụng trong phần mô tả. Thứ nhất, như các bạn đã biết, máy tính chỉ làm việc với các số trong hệ nhị phân, cụ thể là số 0 và số 1 (“đại số Boolean”, nếu có ai học ở viện, trường). Một byte bao gồm tám bit, mỗi bit là lũy thừa của hai, bắt đầu từ 0 và kết thúc bằng hai đến lũy thừa thứ bảy:
Không khó hiểu khi tất cả các tổ hợp số 0 và số 1 có thể có trong cách xây dựng như vậy chỉ có thể là 256. Chuyển đổi một số từ hệ thống nhị phân sang số thập phân khá đơn giản. Bạn chỉ cần cộng tất cả lũy thừa của hai với lũy thừa ở trên chúng. Trong ví dụ của chúng ta, kết quả này là 1 (2 lũy thừa 0) cộng 8 (hai lũy thừa 3), cộng 32 (hai lũy thừa năm), cộng 64 (lũy thừa sáu), cộng 128 (đến lũy thừa thứ bảy). Tổng cộng được 233 trong hệ thống thập phânĐang tính toán. Như bạn có thể thấy, mọi thứ đều rất đơn giản. Nhưng nếu bạn nhìn kỹ vào bảng có các ký tự ASCII, bạn sẽ thấy chúng được biểu diễn dưới dạng mã thập lục phân. Ví dụ: "dấu hoa thị" tương ứng với số thập lục phân 2A trong Aski. Có lẽ bạn biết điều đó trong hệ thập lục phân Các con số được sử dụng ngoài các chữ số Ả Rập và các chữ cái Latinh từ A (có nghĩa là mười) đến F (có nghĩa là mười lăm). Vậy thì, đối với dịch Số nhị phân sang thập lục phân hãy sử dụng phương pháp đơn giản và rõ ràng sau đây. Mỗi byte thông tin được chia thành hai phần bốn bit, như thể hiện trong ảnh chụp màn hình ở trên. Cái đó. trong mỗi nửa byte mã nhị phân chỉ có mười sáu giá trị có thể được mã hóa (hai lũy thừa thứ tư), có thể dễ dàng được biểu diễn dưới dạng số thập lục phân. Hơn nữa, ở nửa bên trái của byte, độ sẽ cần được tính lại bắt đầu từ 0 chứ không phải như trong ảnh chụp màn hình. Kết quả là, thông qua các phép tính đơn giản, chúng ta có được số E9 được mã hóa trong ảnh chụp màn hình. Tôi hy vọng rằng quá trình lập luận của tôi và lời giải cho câu đố này đã rõ ràng với bạn. Chà, trên thực tế, bây giờ chúng ta hãy tiếp tục nói về mã hóa văn bản.

Phiên bản mở rộng của mã hóa Asuka - CP866 và KOI8-R với đồ họa giả

Vì vậy, chúng tôi bắt đầu nói về ASCII, vốn là điểm khởi đầu cho sự phát triển của tất cả các bảng mã hiện đại (Windows 1251, Unicode, UTF 8). Ban đầu, nó chỉ chứa 128 ký tự của bảng chữ cái Latinh, chữ số Ả Rập và một số ký tự khác, nhưng trong phiên bản mở rộng, nó có thể sử dụng tất cả 256 giá trị có thể được mã hóa trong một byte thông tin. Những thứ kia. Có thể thêm các ký hiệu chữ cái trong ngôn ngữ của bạn vào Aski. Ở đây chúng ta sẽ cần phải lạc đề một lần nữa để giải thích - Tại sao chúng ta cần mã hóa văn bản? và tại sao nó lại quan trọng đến thế. Các ký tự trên màn hình máy tính của bạn được hình thành dựa trên hai thứ - tập hợp các hình dạng vectơ (biểu diễn) của tất cả các loại ký tự (chúng nằm trong các tệp có phông chữ được cài đặt trên máy tính của bạn) và mã cho phép bạn lấy ra chính xác. biểu tượng từ tập hợp các hình dạng vectơ (tệp phông chữ) này sẽ cần được chèn vào đúng vị trí. Rõ ràng là bản thân các phông chữ chịu trách nhiệm tạo ra các hình dạng vectơ, nhưng hệ điều hành và các chương trình được sử dụng trong đó chịu trách nhiệm mã hóa. Những thứ kia. bất kỳ văn bản nào trên máy tính của bạn sẽ là một tập hợp các byte, mỗi byte mã hóa một ký tự duy nhất của chính văn bản này. Chương trình hiển thị văn bản này trên màn hình (trình soạn thảo văn bản, trình duyệt, v.v.), khi phân tích mã, đọc mã hóa của ký tự tiếp theo và tìm dạng vectơ tương ứng trong tập tin cần thiết phông chữ được kết nối để hiển thị tài liệu văn bản này. Mọi thứ đều đơn giản và tầm thường. Điều này có nghĩa là để mã hóa bất kỳ ký tự nào chúng ta cần (ví dụ: từ bảng chữ cái quốc gia), phải đáp ứng hai điều kiện - dạng vectơ của ký tự này phải ở phông chữ được sử dụng và ký tự này có thể được mã hóa ở dạng mở rộng. bảng mã ASCII trong một byte. Vì vậy, có rất nhiều lựa chọn như vậy. Chỉ để mã hóa các ký tự tiếng Nga, có một số loại Aska mở rộng. Ví dụ, ban đầu xuất hiện CP866, có khả năng sử dụng các ký tự từ bảng chữ cái tiếng Nga và là phiên bản mở rộng của ASCII. Những thứ kia. phần trên của nó hoàn toàn trùng khớp với phiên bản cơ bản của Aska (128 ký tự Latinh, số và những thứ vớ vẩn khác), được trình bày trong ảnh chụp màn hình ngay phía trên, nhưng phần dưới của bảng có mã hóa CP866 có giao diện như được chỉ ra trong ảnh chụp màn hình ngay bên dưới và cho phép bạn mã hóa 128 ký hiệu khác (các chữ cái tiếng Nga và tất cả các loại bút danh):
Bạn thấy đấy, ở cột bên phải các số bắt đầu bằng 8, bởi vì... các số từ 0 đến 7 đề cập đến phần cơ bản của ASCII (xem ảnh chụp màn hình đầu tiên). Cái đó. Chữ "M" tiếng Nga trong CP866 sẽ có mã 9C (nằm ở giao điểm của hàng tương ứng với 9 và cột có số C trong hệ thập lục phân), có thể được viết bằng một byte thông tin và nếu có phông chữ phù hợp với các ký tự tiếng Nga, chữ cái này sẽ xuất hiện trong văn bản mà không gặp vấn đề gì. Số tiền này đến từ đâu? bút giả trong CP866? Toàn bộ vấn đề ở đây là cách mã hóa văn bản tiếng Nga này đã được phát triển từ những năm tháng tồi tàn khi chưa có sự phát triển mạnh mẽ của đồ họa. các hệ điều hành như bây giờ. Và trong Dosa và các hệ điều hành văn bản tương tự, bút danh ít nhất có thể đa dạng hóa thiết kế văn bản bằng cách nào đó, và do đó CP866 và tất cả các hệ điều hành tương tự khác của nó thuộc danh mục phiên bản mở rộng của Asuka có rất nhiều trong đó. CP866 được phân phối công ty IBM, nhưng bên cạnh đó, một số bảng mã đã được phát triển cho các ký tự tiếng Nga, ví dụ, cùng loại (ASCII mở rộng) có thể được quy cho KOI8-R:
Nguyên lý hoạt động của nó vẫn giống như nguyên lý hoạt động của CP866 được mô tả trước đó một chút - mỗi ký tự văn bản được mã hóa bằng một byte đơn. Ảnh chụp màn hình hiển thị nửa sau của bảng KOI8-R, bởi vì nửa đầu hoàn toàn phù hợp với Asuka cơ bản, được hiển thị trong ảnh chụp màn hình đầu tiên trong bài viết này. Trong số các tính năng của mã hóa KOI8-R, có thể lưu ý rằng các chữ cái tiếng Nga trong bảng của nó không đi vào thứ tự ABC, chẳng hạn như họ đã làm trong CP866. Nếu bạn nhìn vào ảnh chụp màn hình đầu tiên (của phần cơ bản, được bao gồm trong tất cả các bảng mã mở rộng), bạn sẽ nhận thấy rằng trong KOI8-R, các chữ cái tiếng Nga nằm trong cùng các ô của bảng với các chữ cái tương ứng của bảng chữ cái Latinh từ phần đầu tiên của bảng. Điều này được thực hiện để thuận tiện cho việc chuyển đổi từ các ký tự tiếng Nga sang tiếng Latinh bằng cách loại bỏ chỉ một bit (hai đến lũy thừa thứ bảy hoặc 128).

Windows 1251 - phiên bản hiện đại của ASCII và lý do xuất hiện các vết nứt

Sự phát triển hơn nữa của mã hóa văn bản là do các hệ điều hành đồ họa ngày càng phổ biến và nhu cầu sử dụng đồ họa giả trong chúng biến mất theo thời gian. Kết quả là, cả một nhóm phát sinh ra rằng về bản chất, vẫn là các phiên bản mở rộng của Asuka (một ký tự văn bản được mã hóa chỉ bằng một byte thông tin), nhưng không sử dụng các ký hiệu giả. Họ thuộc về cái gọi là Mã hóa ANSI, được phát triển bởi Viện Tiêu chuẩn Hoa Kỳ. Theo cách nói thông thường, tên Cyrillic cũng được sử dụng cho phiên bản có hỗ trợ tiếng Nga. Một ví dụ về điều này có thể là Windows 1251. Nó khác biệt so với CP866 và KOI8-R được sử dụng trước đó ở chỗ vị trí của các ký hiệu giả trong đó được thay thế bằng các ký hiệu còn thiếu của kiểu chữ tiếng Nga (ngoại trừ dấu trọng âm), cũng như các ký hiệu được sử dụng trong tiếng Nga tương tự. ngôn ngữ Slav(tiếng Ukraina, tiếng Belarus, v.v.):
Do có rất nhiều bảng mã ngôn ngữ tiếng Nga, các nhà sản xuất và sản xuất phông chữ phần mềm những cơn đau đầu liên tục xuất hiện, và bạn và tôi, những độc giả thân mến, thường xuyên mắc phải những cơn đau đầu tương tự krakozyabry khi có sự nhầm lẫn với phiên bản được sử dụng trong văn bản. Chúng rất thường xuyên xuất hiện khi gửi và nhận tin nhắn qua e-mail, đòi hỏi phải tạo ra các bảng chuyển đổi rất phức tạp, trên thực tế, không thể giải quyết được vấn đề này và người dùng thường sử dụng phiên âm các chữ cái Latinh để trao đổi thư từ nhằm tránh những mánh lới quảng cáo khét tiếng khi sử dụng bảng mã tiếng Nga như CP866, KOI8- R hoặc Windows 1251 Trên thực tế, các krakozyabrs xuất hiện thay vì văn bản tiếng Nga là kết quả của việc sử dụng mã hóa không chính xác của ngôn ngữ này, không khớp với mã được mã hóa tin nhắn văn bản ban đầu. Ví dụ: nếu bạn cố gắng hiển thị các ký tự được mã hóa bằng CP866 bằng mã Bảng Windows 1251, thì những từ vô nghĩa tương tự (một bộ ký tự vô nghĩa) sẽ xuất hiện, thay thế hoàn toàn nội dung của tin nhắn. Tình huống tương tự rất thường xảy ra khi tạo và thiết lập trang web, diễn đàn hoặc blog, khi văn bản có ký tự tiếng Nga bị lưu nhầm bằng mã hóa sai được sử dụng trên trang web theo mặc định hoặc mã hóa sai soạn thảo văn bản, điều này thêm các gags vào mã mà mắt thường không nhìn thấy được. Cuối cùng, nhiều người cảm thấy mệt mỏi với tình trạng này với rất nhiều mã hóa và liên tục phát sinh lỗi, các điều kiện tiên quyết xuất hiện để tạo ra một biến thể phổ quát mới có thể thay thế tất cả các biến thể hiện có và cuối cùng sẽ giải quyết được vấn đề với sự xuất hiện của văn bản có thể đọc được. Ngoài ra, còn có vấn đề với các ngôn ngữ như tiếng Trung, nơi có nhiều ký tự ngôn ngữ hơn 256.

Unicode - bảng mã phổ quát UTF 8, 16 và 32

Hàng ngàn ký tự thuộc nhóm ngôn ngữ Đông Nam Á này không thể được mô tả bằng một byte thông tin được phân bổ để mã hóa các ký tự trong các phiên bản mở rộng của ASCII. Kết quả là một tập đoàn đã được thành lập có tên là bảng mã Unicode(Unicode - Unicode Consortium) với sự hợp tác của nhiều nhà lãnh đạo ngành CNTT (những người sản xuất phần mềm, những người mã hóa phần cứng, những người tạo ra phông chữ), những người quan tâm đến sự xuất hiện của một loại mã hóa văn bản phổ quát. Biến thể đầu tiên được phát hành dưới sự bảo trợ của Hiệp hội Unicode là UTF 32. Số trong tên mã hóa có nghĩa là số bit được sử dụng để mã hóa một ký tự. 32 bit tương đương 4 byte thông tin sẽ cần thiết để mã hóa một ký tự đơn trong mã hóa UTF phổ quát mới. Kết quả là, cùng một tệp có văn bản được mã hóa ở phiên bản mở rộng của ASCII và UTF-32, trong trường hợp sau, sẽ có kích thước (nặng) lớn hơn bốn lần. Điều này thật tệ, nhưng bây giờ chúng ta có cơ hội mã hóa bằng YTF một số ký tự bằng hai lũy thừa ba mươi giây ( hàng tỷ ký tự, sẽ bao gồm mọi giá trị thực sự cần thiết với biên độ khổng lồ). Nhưng đối với nhiều quốc gia có ngôn ngữ thuộc nhóm châu Âu thì điều này số lượng lớn Hoàn toàn không cần sử dụng các ký tự trong mã hóa, nhưng khi sử dụng UTF-32, chúng sẽ không bao giờ nhận được trọng lượng tăng gấp bốn lần tài liệu văn bản và kết quả là lưu lượng truy cập Internet và lượng dữ liệu được lưu trữ tăng lên. Đây là rất nhiều, và không ai có thể đủ khả năng lãng phí như vậy. Nhờ sự phát triển của Unicode, UTF-16, hóa ra lại thành công đến mức nó được mặc định sử dụng làm khoảng trống cơ sở cho tất cả các ký tự mà chúng tôi sử dụng. Nó sử dụng hai byte để mã hóa một ký tự. Hãy xem thứ này trông như thế nào. Trong hệ điều hành Windows, bạn có thể đi theo đường dẫn “Bắt đầu” - “Chương trình” - “Phụ kiện” - “Công cụ hệ thống” - “Bảng ký tự”. Kết quả là một bảng sẽ mở ra với các hình dạng vector của tất cả các phông chữ được cài đặt trên hệ thống của bạn. Nếu bạn chọn trong " Tùy chọn bổ sung» bộ ký tự Unicode, bạn có thể xem riêng từng phông chữ toàn bộ phạm vi ký tự có trong đó. Nhân tiện, bằng cách nhấp vào bất kỳ cái nào trong số chúng, bạn có thể thấy hai byte của nó mã ở định dạng UTF-16, bao gồm bốn chữ số thập lục phân: Có bao nhiêu ký tự có thể được mã hóa bằng UTF-16 bằng 16 bit? 65.536 (hai lũy thừa mười sáu) và đây là con số được sử dụng làm không gian cơ sở trong Unicode. Ngoài ra, có nhiều cách để mã hóa khoảng hai triệu ký tự bằng cách sử dụng nó, nhưng chúng bị giới hạn trong không gian mở rộng gồm một triệu ký tự văn bản. Nhưng ngay cả phiên bản thành công này của bảng mã Unicode cũng không mang lại nhiều sự hài lòng cho những người viết, chẳng hạn như các chương trình chỉ ở dạng tiếng anh, bởi vì sau khi chuyển đổi từ phiên bản mở rộng của ASCII sang UTF-16, trọng lượng của tài liệu đã tăng gấp đôi (một byte cho mỗi ký tự trong Aski và hai byte cho cùng một ký tự trong UTF-16). Chính vì sự hài lòng của mọi người và mọi thứ trong tập đoàn Unicode mà nó đã được quyết định nghĩ ra một cách mã hóa chiều dài thay đổi. Nó được gọi là UTF-8. Mặc dù có tên là tám, nhưng nó thực sự có độ dài thay đổi, tức là Mỗi ký tự của văn bản có thể được mã hóa thành một chuỗi có độ dài từ một đến sáu byte. Trong thực tế, UTF-8 chỉ sử dụng phạm vi từ một đến bốn byte, vì ngoài bốn byte mã, về mặt lý thuyết, thậm chí không thể tưởng tượng được bất cứ điều gì. Tất cả các ký tự Latinh trong đó được mã hóa thành một byte, giống như trong ASCII cũ. Điều đáng chú ý là trong trường hợp chỉ mã hóa bảng chữ cái Latinh, ngay cả những chương trình không hiểu Unicode vẫn sẽ đọc những gì được mã hóa bằng YTF-8. Những thứ kia. phần cốt lõi của Asuka chỉ đơn giản được chuyển sang việc thành lập tập đoàn Unicode này. Các ký tự Cyrillic trong UTF-8 được mã hóa thành hai byte và, ví dụ: ký tự Georgia - bằng ba byte. Hiệp hội Unicode, sau khi tạo UTF 16 và 8, đã giải quyết được vấn đề chính - bây giờ chúng ta có phông chữ có một không gian mã duy nhất. Và bây giờ các nhà sản xuất của họ chỉ có thể lấp đầy nó bằng các dạng ký tự văn bản vector dựa trên điểm mạnh và khả năng của chúng. Trong "Bảng ký tự" ở trên, bạn có thể thấy các phông chữ khác nhau hỗ trợ số lượng khác nhau dấu hiệu. Một số phông chữ giàu Unicode có thể khá nặng. Nhưng bây giờ chúng khác nhau không phải ở chỗ chúng được tạo ra cho các bảng mã khác nhau, mà ở chỗ nhà sản xuất phông chữ đã lấp đầy hoặc không lấp đầy hoàn toàn không gian mã đơn bằng các dạng vectơ nhất định.

Những từ điên rồ thay vì chữ Nga - cách khắc phục

Bây giờ chúng ta hãy xem cách krakozyabrs xuất hiện thay vì văn bản hay nói cách khác là cách chọn mã hóa chính xác cho văn bản tiếng Nga. Trên thực tế, nó được đặt trong chương trình mà bạn tạo hoặc chỉnh sửa chính văn bản hoặc mã này bằng cách sử dụng các đoạn văn bản. Theo ý kiến ​​​​của tôi, để chỉnh sửa và tạo các tệp văn bản, cá nhân tôi sử dụng một trình soạn thảo Html và PHP Notepad++ rất tốt. Tuy nhiên, nó có thể làm nổi bật cú pháp của hàng trăm ngôn ngữ lập trình và đánh dấu khác, đồng thời có khả năng mở rộng bằng cách sử dụng các plugin. Đọc đánh giá chi tiết chương trình tuyệt vời này tại liên kết được cung cấp. Trong menu trên cùng của Notepad++ có một mục “Mã hóa”, nơi bạn sẽ có cơ hội chuyển đổi tùy chọn hiện có sang tùy chọn được sử dụng theo mặc định trên trang web của mình:
Trong trường hợp trang web trên Joomla 1.5 trở lên, cũng như trong trường hợp blog trên WordPress, bạn nên chọn tùy chọn để tránh xuất hiện các vết nứt UTF 8 không có BOM. Tiền tố BOM là gì? Thực tế là khi họ đang phát triển mã hóa YUTF-16, vì lý do nào đó, họ đã quyết định gắn vào nó một thứ như khả năng viết mã ký tự theo cả chuỗi trực tiếp (ví dụ: 0A15) và ngược lại (150A) . Và để các chương trình hiểu chính xác trình tự đọc mã, người ta đã phát minh ra BOM(Dấu thứ tự byte hay nói cách khác là chữ ký), được thể hiện bằng việc thêm ba byte bổ sung vào phần đầu của tài liệu. Trong mã hóa UTF-8, không có BOM nào được cung cấp trong tập đoàn Unicode và do đó việc thêm chữ ký (ba byte bổ sung khét tiếng ở đầu tài liệu) chỉ đơn giản là ngăn một số chương trình đọc mã. Vì vậy, khi lưu file dưới dạng UTF, chúng ta phải luôn chọn tùy chọn không có BOM (không có chữ ký). Vậy là bạn đã biết trước bảo vệ bạn khỏi bò krakozyabrs. Điều đáng chú ý là một số chương trình trong Windows không thể thực hiện được điều này (chúng không thể lưu văn bản ở dạng UTF-8 mà không có BOM), chẳng hạn như Windows Notepad khét tiếng. Nó lưu tài liệu ở dạng UTF-8, nhưng vẫn thêm chữ ký (ba byte bổ sung) vào đầu tài liệu. Hơn nữa, các byte này sẽ luôn giống nhau - đọc mã theo trình tự trực tiếp. Nhưng trên các máy chủ, vì điều nhỏ nhặt này, một vấn đề có thể nảy sinh - kẻ gian sẽ lộ diện. Vì vậy, trong mọi trường hợp không sử dụng thường xuyên Sổ tay Windows để chỉnh sửa tài liệu trên trang web của bạn nếu bạn không muốn bất kỳ vết nứt nào xuất hiện. Tôi nghĩ tùy chọn tốt nhất và đơn giản nhất là tùy chọn đã được đề cập Trình soạn thảo sổ tay++, thực tế không có nhược điểm và chỉ bao gồm các ưu điểm. Trong Notepad++, khi bạn chọn một kiểu mã hóa, bạn sẽ có tùy chọn chuyển đổi văn bản sang mã hóa UCS-2, về bản chất rất gần với tiêu chuẩn Unicode. Ngoài ra, Notepad còn có thể mã hóa văn bản ở định dạng ANSI, tức là liên quan đến tiếng Nga, đây sẽ là Windows 1251, mà chúng tôi đã mô tả ở trên. Thông tin này đến từ đâu? Nó được đăng ký trong sổ đăng ký hệ điều hành Windows của bạn - nên chọn mã hóa nào trong trường hợp ANSI, nên chọn mã hóa nào trong trường hợp OEM (đối với ngôn ngữ tiếng Nga, nó sẽ là CP866). Nếu bạn cài đặt một ngôn ngữ mặc định khác trên máy tính của mình thì những bảng mã này sẽ được thay thế bằng những ngôn ngữ tương tự từ danh mục ANSI hoặc OEM cho cùng ngôn ngữ đó. Sau khi lưu tài liệu trong Notepad++ ở dạng mã hóa bạn cần hoặc mở tài liệu từ trang web để chỉnh sửa, bạn có thể thấy tên của nó ở góc dưới bên phải của trình chỉnh sửa: Để tránh bị tắc nghẽn, ngoài các hành động được mô tả ở trên, sẽ rất hữu ích khi viết vào tiêu đề của nó mã nguồn tất cả các trang của trang web đều có thông tin về chính mã hóa này để không gây nhầm lẫn trên máy chủ hoặc máy chủ cục bộ. Nói chung, trong tất cả các ngôn ngữ đánh dấu siêu văn bản Ngoài Html, một khai báo xml đặc biệt được sử dụng để biểu thị mã hóa văn bản.< ? xml version= "1.0" encoding= "windows-1251" ? >Trước khi phân tích mã, trình duyệt sẽ biết phiên bản nào đang được sử dụng và cách nó cần diễn giải mã ký tự của ngôn ngữ đó một cách chính xác như thế nào. Nhưng điều đáng chú ý là nếu bạn lưu tài liệu ở dạng Unicode mặc định thì có thể bỏ qua khai báo xml này (mã hóa sẽ được coi là UTF-8 nếu không có BOM hoặc UTF-16 nếu có BOM). Trong trường hợp tài liệu bằng ngôn ngữ Html, mã hóa được sử dụng để biểu thị Phần tử meta, được viết giữa thẻ Head mở và đóng: < head> . . . < meta charset= "utf-8" > . . . < / head>Mục nhập này khá khác so với mục được áp dụng trong tiêu chuẩn trong Html 4.01, nhưng nó hoàn toàn tuân thủ tiêu chuẩn Html 5 mới đang dần được giới thiệu và nó sẽ được mọi trình duyệt hiện đang sử dụng hiểu hoàn toàn chính xác. Về lý thuyết, một phần tử Meta có dấu hiệu Mã hóa HTML sẽ tốt hơn nếu đặt tài liệu càng cao càng tốt trong tiêu đề tài liệuđể tại thời điểm gặp ký tự đầu tiên trong văn bản không phải từ ANSI cơ bản (luôn được đọc chính xác và ở bất kỳ biến thể nào), trình duyệt phải có sẵn thông tin về cách diễn giải mã của các ký tự này. Liên kết đến đầu tiên

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 kết hợp tất cả chúng thành tiêu chuẩn đơn là một nhiệm vụ vô cùng 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 nguyên tắc quan trọng câu hỏi thực tế, điều 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 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ì vậy, ví dụ, ký tự Unicode U+041F là chữ hoa chữ cái Cyrillic P. Có một số khả năng trình bày. của biểu tượng này trong bộ nhớ của máy tính, giống như 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 Trái đất. 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.

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 từng byte hóa ra lại rất thiết thực khi làm việc với một lượng lớn các ngôn ngữ đơn ngữ. thông tin văn bản.

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ủ Habra trong UTF-8 mất 139Kb và trong UTF-16 đã 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ì dung lượng sẽ giảm đi chỉ 11Kb.

Để 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. Phòng phẫu thuật Hệ thống Windows cũng sử dụng UTF-16 trong 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 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.
  • 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 bạn mã hóa Một phần nhỏ Phổ Unicode, nhưng có thể hữu ích khi làm việc với một 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 bên trong để 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à hoạt động chính xác với toàn bộ không gian 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 .

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 ra ngoài 2 16 ngay từ phiên bản 2.0, nhưng các ký tự đầu tiên ở 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 - cho các chữ tượng hình KKY hiếm khi được sử dụng, mặt phẳng thứ ba dành cho các chữ tượng hình cổ xưa nhân vật Trung Quố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ý hiệu đồ họa ký tự điều khiển và ký tự định dạng tương phản nhau.

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 tùy chọn kiểu được xác định cho hàng ký hiệu toán học, đối với các ký tự trong bảng chữ cái tiếng Mông Cổ truyền thống và đối với các ký tự chữ vuô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 hỗ trợ các văn bản kết hợp kết hợp các đoạn với các hướng viết khác nhau. Cơ hội này gọi điện tính hai chiều(Tiếng Anh) văn bản hai chiều, BiDi). Một số bộ xử lý văn bản được đơn giản hóa (ví dụ: trong điện thoại cầm tay) có thể hỗ trợ Unicode nhưng không hỗ trợ 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 làm việc ISO/IEC/JTC1/SC2/WG2, đang xây dựng 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 một cách đáng tin cậy giữa UTF-16LE và UTF-32LE, 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ó - để làm điều 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 nhấn giữ Phím Alt. Bạn có thể nhập các ký tự theo mã thập lục phân: để thực hiện việc này, bạn cần giữ phím AltGr và để nhập các số A-F hãy sử dụng các phím của 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ợ. phương pháp được liệt kê có thể 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.

Có một trang đặc biệt trên trang web của Consortium thảo luận về các vấn đề chuyển từ “Unicode” sang nhiều ngôn ngữ khác nhau và hệ thống chữ viết. Đố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 những sản phẩm hiện đại và đắt tiền nhất điện thoại di động rất khó phân bổ 120 MB bộ nhớ cho một phông chữ Unicode đầy đủ. Trong thực tế 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