Introduction to Unicode and UTF-8

Unicode is an industry standard for consistent encoding of written text. Learn the basics and most important parts of it, in particular concerning UTF-8

Unicode làmột tiêu chuẩn công nghiệp để mã hóa nhất quán văn bản viết.

Có rất nhiều bộ ký tự được sử dụng bởi máy tính, nhưng Unicode là bộ ký tự đầu tiên nhằm hỗ trợ mọi ngôn ngữ viết trên trái đất (và hơn thế nữa!).

Mục đích của nó là cung cấp một số duy nhất để xác định mọi ký tự cho mọi ngôn ngữ, trên mọi nền tảng.

Unicode ánh xạ mọi ký tự thành một mã cụ thể, được gọi làđiểm mã. Một điểm mã có dạngU+<hex-code>, từU+0000đếnU+10FFFF.

Một điểm mã ví dụ trông như thế này:U+004F. Ý nghĩa của nó phụ thuộc vào bảng mã ký tự được sử dụng.

Unicode định nghĩa khác nhaubảng mã ký tự, những cái được sử dụng nhiều nhất là UTF-8, UTF-16 và UTF-32.

UTF-8 chắc chắn là bảng mã phổ biến nhất trong họ Unicode, đặc biệt là trên Web. Ví dụ: tài liệu này được viết bằng UTF-8.

Hiện tại có hơn 135.000 ký tự khác nhau được thực hiện, với khoảng trống hơn 1,1 triệu.

Tập lệnh

Tất cả các ký tự được hỗ trợ Unicode được nhóm thành các phần được gọi làtập lệnh.

Có một tập lệnh cho mọi bộ ký tự khác nhau:

  • Tiếng Latinh (chứa tất cả ASCII + tất cả các ký tự khác của thế giới phương Tây)
  • Hàn Quốc
  • Tiếng Hungary cổ
  • Tiếng Do Thái
  • người Hy Lạp
  • Tiếng Armenia
  • …và như thế!

Danh sách đầy đủ được xác định trongTiêu chuẩn ISO 15924.

Xem thêm về tập lệnh:https://en.wikipedia.org/wiki/Script_(Unicode)

Máy bay

Ngoài các tập lệnh, có một cách khác mà Unicode tổ chức các ký tự của nó:máy bay.

Thay vì nhóm chúng theo loại, nó sẽ kiểm tra giá trị điểm mã:

Máy bay Phạm vi
0 U + 0000 - U + FFFF
1 U + 10000 - U + 1FFFF
2 U + 20000 - U + 2FFFF
14 U + E0000 - U + EFFFF
15 U + F0000 - U + FFFFF
16 U + 100000 - U + 10FFFF

Có 17 máy bay.

Đầu tiên là đặc biệt, nó được gọi làMặt phẳng đa ngôn ngữ cơ bản, hoặc làBMP, và chứa hầu hết các ký tự và ký hiệu hiện đại, từ hệ thống chữ viết Latinh, Cyrillic, Hy Lạp.

16 máy bay khác được gọi làmáy bay thiên văn. Đáng chú ý là các máy bay từ 3 đến 13 hiện đang trống.

Các điểm mã chứa trong các mặt phẳng trung gian được gọi làđiểm mã astral.

Tất cả các điểm mã Astral đều cao hơnU+10000.

Đơn vị mã

Điểm mã được lưu trữ nội bộ dưới dạngđơn vị mã. Một đơn vị mã là biểu diễn bit của một ký tự và độ dài của nó thay đổi tùy thuộc vào mã hóa ký tự

UTF-32 sử dụng đơn vị mã 32 bit.

UTF-8 sử dụng đơn vị mã 8 bit và UTF-16 sử dụng đơn vị mã 16 bit. Nếu một điểm mã cần kích thước lớn hơn, nó sẽ được biểu thị bằng 2 (hoặc nhiều hơn, theo UTF-8) đơn vị mã.

Graphemes

Grapheme là một ký hiệu đại diện cho một đơn vị của hệ thống chữ viết. Về cơ bản làý tưởng của bạncủa một nhân vật và nó sẽ trông như thế nào.

Glyphs

Glyph là một biểu diễn đồ họa của grapheme: cách nó được hiển thị trực quan trên màn hình, hình thức thực tế trên màn hình.

Trình tự

Unicode cho phép bạn kết hợp các ký tự khác nhau để tạo thành grapheme.

Ví dụ, đó là trường hợp của các ký tự có dấu: chữ cáiécó thể được thể hiện bằng cách sử dụng kết hợp các chữ cáie(U+0065) và ký tự unicode có tên “COMBINING ACUTE ACCENT” (U+0301):

"U+0065U+0301" ➡️ "é"

U+0301trong trường hợp này là những gì được mô tả làkết hợp đánh dấu, một ký tự áp dụng cho ký tự trước đó để tạo thành một grapheme khác.

Bình thường hóa

Một ký tự đôi khi có thể được biểu diễn bằng cách sử dụng các kết hợp khác nhau của các điểm mã.

Ví dụ, đó là trường hợp của các ký tự có dấu: chữ cáiécó thể được thể hiện cả hai nhưU+00E9và cũng như kết hợpe(U+0065) và ký tự unicode có tên “COMBINING ACUTE ACCENT” (U+0301):

U+00E9       ➡️ "é"
U+0065U+0301 ➡️ "é"

Quá trình chuẩn hóa phân tích một chuỗi cho những loại không rõ ràng đó và tạo ra một chuỗi với biểu diễn chính tắc của bất kỳ ký tự nào.

Nếu không chuẩn hóa, các chuỗi hoàn toàn bằng nhau đối với mắt sẽ được coi là khác nhau vì biểu diễn bên trong của chúng thay đổi:

Biểu tượng cảm xúc

Biểu tượng cảm xúc là các ký tự mặt phẳng trung gian Unicode và chúng cung cấp một cách để hiển thị hình ảnh trên màn hình của bạn mà không thực sự có hình ảnh thực, chỉ là phông chữ glyphs.

Ví dụ, biểu tượng 🐶 được mã hóa thànhU+1F436.

128 ký tự đầu tiên

128 ký tự đầu tiên của Unicode giống như bộ ký tự ASCII.

32 ký tự đầu tiên,U+0000-U+001F(0-31) được gọi làMã kiểm soát.

Chúng là một sự kế thừa từ quá khứ và hầu hết chúng hiện nay đã lỗi thời. Chúng được sử dụng cho các máy teletype, một thứ tồn tại trước cả fax.

Các ký tự từ U + 0020 (32) đến U + 007E (126) chứa số, chữ cái và một số ký hiệu:

Unicode Mã ASCII Glyph
U + 0020 32 (không gian)
U + 0021 33 !
U + 0022 34
U + 0023 35 #
U + 0024 36 $
U + 0025 37 %
U + 0026 38 &
U + 0027 39 '
U + 0028 40 (
U + 0029 41 )
U + 002A 42 *
U + 002B 43 +
U + 002C 44 ,
U + 002D 45 -
U + 002E 46 .
U + 002F 47 /
U + 0030 48 0
U + 0031 49 1
U+0032 50 2
U+0033 51 3
U+0034 52 4
U+0035 53 5
U+0036 54 6
U+0037 55 7
U+0038 56 8
U+0039 57 9
U + 003A 58 :
U + 003B 59 ;
U + 003C 60 <
U + 003D 61 =
U + 003E 62 >
U + 003F 63 ?
U+0040 64 @
U+0041 65 A
U+0042 66 B
U+0043 67 C
U+0044 68 D
U+0045 69 E
U+0046 70 F
U+0047 71 G
U+0048 72 H
U+0049 73 Tôi
U + 004A 74 J
U + 004B 75 K
U + 004C 76 L
U + 004D 77 M
U + 004E 78 N
U + 004F 79 O
U+0050 80 P
U+0051 81 Q
U+0052 82 R
U+0053 83 S
U+0054 84 T
U+0055 85 U
U+0056 86 V
U+0057 87 W
U+0058 88 X
U+0059 89 Y
U + 005A 90 Z
U + 005B 91 [
U + 005C 92
U + 005D 93 ]
U + 005E 94 ^
U + 005F 95 _
U+0060 96 `
U+0061 97 a
U+0062 98 b
U+0063 99 c
U+0064 100 d
U+0065 101 e
U+0066 102 f
U+0067 103 g
U+0068 104 h
U+0069 105 Tôi
U + 006A 106 j
U + 006B 107 k
U + 006C 108 l
U + 006D 109 m
U + 006E 110 n
U + 006F 111 o
U+0070 112 p
U+0071 113 q
U+0072 114 r
U+0073 115 S
U+0074 116 t
U+0075 117 u
U+0076 118 v
U+0077 119 w
U+0078 120 x
U+0079 121 y
U + 007A 122 z
U + 007B 123 {
U + 007C 124
U + 007D 125 }
U + 007E 126 ~
  • Các con số bắt nguồn từU+0030đếnU+0039
  • Chữ hoa đi từU+0041đếnU+005A
  • Chữ thường đi từU+0061đếnU+007A

U + 007F (127) là ký tự xóa.

Mọi thứ về sau đều nằm ngoài phạm vi của ASCII và là một phần của Unicode độc quyền.

Bạn có thể tìm thấy toàn bộ danh sách trên Wikipedia:https://en.wikipedia.org/wiki/List_of_Unicode_characters

Bảng mã Unicode

UTF-8

UTF-8 là một mã hóa ký tự có độ rộng thay đổi và nó có thể mã hóa mọi ký tự được Unicode bao phủ, sử dụng từ 1 đến 4 byte 8 bit.

Ban đầu nó được thiết kế bởi Ken Thompson và Rob Pike vào năm 1992. Những cái tên này quen thuộc với những người quan tâm đến ngôn ngữ lập trình cờ vây, vì họ cũng là hai trong số những người sáng tạo ra nó.

Nó được W3C đề xuất làm mã hóa mặc định trong các tệp HTML và số liệu thống kê cho thấy nó được sử dụng trên 91,3% tất cả các trang web, kể từ tháng 4 năm 2018.

Vào thời điểm được giới thiệu, ASCII là bảng mã ký tự phổ biến nhất ở thế giới phương Tây. Trong ASCII tất cả các chữ cái, chữ số và ký hiệu đều được gán một số, và số này. Được cố định thành 8 bit, nó chỉ có thể đại diện cho tối đa 255 ký tự là đủ.

UTF-8 được thiết kế để tương thích ngược với ASCII. Điều này rất quan trọng đối với việc áp dụng nó, vì ASCII đã cũ hơn nhiều (1963) và phổ biến rộng rãi, và việc chuyển sang UTF-8 diễn ra gần như minh bạch.

128 ký tự đầu tiên của UTF-8 ánh xạ chính xác tới ASCII. Tại sao lại là 128? Bởi vì ASCII sử dụng mã hóa 7-bit, cho phép lên đến 128 kết hợp. Tại sao lại là 7 bit? Bây giờ chúng ta coi 8 bit là điều hiển nhiên, nhưng vào thời mà ASCII được hình thành, các hệ thống 7 bit cũng rất phổ biến.

Tương thích 100% với ASCII làm cho UTF-8 cũng rất hiệu quả, vì các ký tự được sử dụng thường xuyên nhất trong các ngôn ngữ phương Tây chỉ được mã hóa bằng 1 byte.

Đây là bản đồ sử dụng byte:

Số byte Khởi đầu Kết thúc
1 U+0000 U+007F
2 U+0080 U+07FF
3 U+0800 U+FFFF
4 U+10000 U+10FFFF

Hãy nhớ rằng trong ASCII, các ký tự đã được mã hóa dưới dạng số? Nếu lá thưAtrong ASCII được biểu diễn bằng số65, sử dụng UTF-8, nó được mã hóa thànhU+0041.

Tại sao khôngU+0065bạn hỏi? Vì unicode sử dụng cơ số thập lục phân và thay vì10bạn cóU+000Avà tiếp tục như vậy (về cơ bản, bạn có một tập hợp gồm 16 chữ số thay vì 10)

Hãy xemVideo này, giải thích rõ ràng về khả năng tương thích UTF-8 và ASCII này.

UTF-16

UTF-16 là một bảng mã Unicode rất phổ biến khác. Ví dụ, đó là cách Java đại diện bên trong bất kỳ ký tự nào. Nó cũng làmột trong 2 mã hóa mà JavaScript sử dụng nội bộ, cùng vớiUCS-2. Nó cũng được sử dụng bởi nhiều hệ thống khác, như Windows.

UTF-16 là một hệ thống mã hóa có độ dài thay đổi, giống như UTF-8, nhưng sử dụng 2 byte (16 bit) là mức tối thiểu cho bất kỳ biểu diễn ký tự nào. Do đó, nó không tương thích ngược với tiêu chuẩn ASCII.

Các điểm mã trong Mặt phẳng đa ngôn ngữ cơ bản (BMP) được lưu trữ bằng cách sử dụng 2 byte. Điểm mã trongmáy bay thiên vănđược lưu trữ bằng cách sử dụng 4 byte.

UTF-32

UTF-8 sử dụng tối thiểu 1 byte, UTF-16 sử dụng tối thiểu 2 byte.

UTF-32 luôn sử dụng 4 byte, mà không tối ưu hóa việc sử dụng không gian, và như vậy, nó lãng phí rất nhiều băng thông.

Ràng buộc này làm cho nó hoạt động nhanh hơn vì bạn có ít phải kiểm tra hơn, vì bạn có thể giả sử 4 byte cho tất cả các ký tự.

Nó không phổ biến như UTF-8 và UTF-16, nhưng nó có các ứng dụng của nó.

Tải xuống miễn phí của tôiSổ tay dành cho Người mới bắt đầu JavaScript


Các hướng dẫn js khác: