Nếu UTF-8 là 8 bit, không có nghĩa là chỉ có thể có tối đa 256 ký tự khác nhau?
128 điểm mã đầu tiên giống như trong ASCII. Nhưng nó nói rằng UTF-8 có thể hỗ trợ tới hàng triệu ký tự?
Cái này hoạt động ra sao?
Nếu UTF-8 là 8 bit, không có nghĩa là chỉ có thể có tối đa 256 ký tự khác nhau?
128 điểm mã đầu tiên giống như trong ASCII. Nhưng nó nói rằng UTF-8 có thể hỗ trợ tới hàng triệu ký tự?
Cái này hoạt động ra sao?
Câu trả lời:
UTF-8 không sử dụng một byte mọi lúc, nó là 1 đến 4 byte.
128 ký tự đầu tiên (US-ASCII) cần một byte.
1.920 ký tự tiếp theo cần hai byte để mã hóa. Điều này bao gồm phần còn lại của hầu hết các bảng chữ cái Latinh, và cả các bảng chữ cái Hy Lạp, Cyrillic, Coptic, Armenia, Hebrew, Ả Rập, Syriac và Tāna, cũng như Kết hợp các dấu phụ.
Ba byte là cần thiết cho các ký tự trong phần còn lại của Mặt phẳng đa ngôn ngữ cơ bản, chứa hầu như tất cả các ký tự được sử dụng phổ biến [12] bao gồm hầu hết các ký tự [CJK] Trung Quốc, Nhật Bản và Hàn Quốc.
Bốn byte là cần thiết cho các ký tự trong các mặt phẳng khác của Unicode, bao gồm các ký tự CJK ít phổ biến hơn, các chữ viết lịch sử khác nhau, các ký hiệu toán học và biểu tượng cảm xúc (ký hiệu hình ảnh).
nguồn: Wikipedia
UTF-8 sử dụng 1-4 byte cho mỗi ký tự: một byte cho các ký tự ascii (128 giá trị unicode đầu tiên giống ascii). Nhưng điều đó chỉ yêu cầu 7 bit. Nếu bit ("dấu") cao nhất được đặt, điều này cho biết sự bắt đầu của một chuỗi nhiều byte; số lượng bit cao liên tiếp được thiết lập cho biết số byte, sau đó là 0 và các bit còn lại đóng góp vào giá trị. Đối với các byte khác, hai bit cao nhất sẽ là 1 và 0 và 6 bit còn lại là giá trị.
Vì vậy, một chuỗi bốn byte sẽ bắt đầu bằng 11110 ... (và ... = ba bit cho giá trị) sau đó ba byte với 6 bit mỗi giá trị, mang lại giá trị 21 bit. 2 ^ 21 vượt quá số ký tự unicode, do đó, tất cả các unicode có thể được thể hiện bằng UTF8.
Theo bảng này * UTF-8 sẽ hỗ trợ:
2 31 = 2.147.483.648 ký tự
Tuy nhiên, RFC 3629 đã hạn chế các giá trị có thể có, vì vậy bây giờ chúng tôi giới hạn ở 4 byte , điều này cho chúng tôi
2 21 = 2.097.152 ký tự
Lưu ý rằng một phần lớn các ký tự đó được "dành riêng" cho việc sử dụng tùy chỉnh, điều này thực sự khá tiện dụng cho các phông chữ biểu tượng.
* Wikipedia đã sử dụng hiển thị một bảng có 6 byte - chúng đã cập nhật bài viết.
2017-07-11: Đã sửa lỗi để đếm kép cùng một điểm mã được mã hóa bằng nhiều byte
0xxxxxxx
cung cấp 7 bit có thể sử dụng, 110xxxxx 10xxxxxx
cung cấp thêm 11 bit - không có sự chồng chéo. Byte đầu tiên bắt đầu bằng 0
trong trường hợp đầu tiên và 1
trong trường hợp thứ hai.
00000001
lưu trữ và lưu trữ những gì 11000000 100000001
?
Unicode phân giải mã điểm thành các ký tự. UTF-8 là một cơ chế lưu trữ cho Unicode. Unicode có một thông số kỹ thuật. UTF-8 có một thông số kỹ thuật. Cả hai đều có những giới hạn khác nhau. UTF-8 có một giới hạn hướng lên khác.
Unicode được chỉ định bằng "máy bay". Mỗi máy bay mang 2 mã 16 điểm. Có 17 Máy bay trong Unicode. Để biết tổng 17 * 2^16
số điểm mã. Mặt phẳng đầu tiên, mặt phẳng 0 hoặc BMP , đặc biệt ở trọng lượng của những gì nó mang theo.
Thay vì giải thích tất cả các sắc thái, hãy để tôi chỉ trích dẫn bài báo trên về máy bay.
17 máy bay có thể chứa 1.114.112 điểm mã. Trong số này, 2.048 là đại diện, 66 là không phải ký tự và 137.468 được dành cho mục đích sử dụng cá nhân, còn lại 974.530 cho chuyển nhượng công khai.
Bây giờ chúng ta hãy quay lại bài viết được liên kết ở trên,
Sơ đồ mã hóa được UTF-8 sử dụng được thiết kế với giới hạn lớn hơn nhiều là 2 31 điểm mã (32.768 mặt phẳng) và có thể mã hóa 2 21 điểm mã (32 mặt phẳng) ngay cả khi giới hạn ở 4 byte. [3] Vì Unicode giới hạn các điểm mã trong 17 mặt phẳng có thể được mã hóa bởi UTF-16, các điểm mã trên 0x10FFFF không hợp lệ trong UTF-8 và UTF-32.
Vì vậy, bạn có thể thấy rằng bạn có thể đưa nội dung vào UTF-8 không phải là Unicode hợp lệ. Tại sao? Bởi vì UTF-8 chứa các điểm mã mà Unicode thậm chí không hỗ trợ.
UTF-8, ngay cả với giới hạn bốn byte, hỗ trợ 2 21 điểm mã, nhiều hơn17 * 2^16
2.164.864 “ký tự” có thể được mã hóa bởi UTF-8.
Con số này là 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21 xuất phát từ cách mã hóa hoạt động:
Các ký tự 1 byte có 7 bit để mã hóa
0xxxxxxx
(0x00-0x7F)
Các ký tự 2 byte có 11 bit để mã hóa
110xxxxx 10xxxxxx
(0xC0-0xDF cho byte đầu tiên; 0x80-0xBF cho byte thứ hai)
Các ký tự 3 byte có 16 bit để mã hóa
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF cho byte đầu tiên; 0x80-0xBF cho byte tiếp tục)
Các ký tự 4 byte có 21 bit để mã hóa
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0xF0-0xF7 cho byte đầu tiên; 0x80-0xBF cho byte tiếp tục)
Như bạn có thể thấy, mã này lớn hơn đáng kể so với Unicode hiện tại (1.112.064 ký tự).
CẬP NHẬT
Tính toán ban đầu của tôi là sai vì nó không xem xét các quy tắc bổ sung. Xem bình luận cho câu trả lời này để biết thêm chi tiết.
UTF-8 là kiểu mã hóa có độ dài thay đổi với tối thiểu 8 bit cho mỗi ký tự.
Các ký tự có điểm mã cao hơn sẽ chiếm tới 32 bit.
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, vì vậy chỉ có thể sử dụng 21 bit để mã hóa ký tự thực.
Trích dẫn từ Wikipedia: "UTF-8 mã hóa từng điểm trong số 1.112.064 điểm mã trong bộ ký tự Unicode bằng cách sử dụng một đến bốn byte 8 bit (được gọi là" bộ tám "trong Chuẩn Unicode)."
Một số liên kết:
Kiểm tra Tiêu chuẩn Unicode và thông tin liên quan, chẳng hạn như mục Câu hỏi thường gặp, UTF-8 UTF-16, UTF-32 & BOM . Nó không phải là thuận buồm xuôi gió, nhưng đó là thông tin có thẩm quyền và phần lớn những gì bạn có thể đọc về UTF-8 ở những nơi khác đều đáng nghi ngờ.
“8” trong “UTF-8” liên quan đến độ dài của các đơn vị mã tính bằng bit. Đơn vị mã là các thực thể được sử dụng để mã hóa các ký tự, không nhất thiết như một ánh xạ một-một đơn giản. UTF-8 sử dụng một số đơn vị mã thay đổi để mã hóa một ký tự.
Tập hợp các ký tự có thể được mã hóa trong UTF-8 hoàn toàn giống với UTF-16 hoặc UTF-32, cụ thể là tất cả các ký tự Unicode. Tất cả chúng đều mã hóa toàn bộ không gian mã hóa Unicode, thậm chí bao gồm các ký tự không ký tự và các điểm mã chưa được gán.
Mặc dù tôi đồng ý với mpen về mã UTF-8 tối đa hiện tại (2.164.864) (được liệt kê bên dưới, tôi không thể bình luận về anh ấy), anh ấy sẽ giảm 2 cấp nếu bạn xóa 2 hạn chế chính của UTF-8: chỉ 4 byte giới hạn và mã 254 và 255 không thể được sử dụng (anh ta chỉ loại bỏ giới hạn 4 byte).
Mã bắt đầu 254 tuân theo sự sắp xếp cơ bản của các bit bắt đầu (cờ nhiều bit được đặt thành 1, số đếm là 6 1 và đầu cuối là 0, không có bit dự phòng) cung cấp cho bạn 6 byte bổ sung để làm việc với (6 nhóm 10xxxxxx, thêm 2 ^ 36 mã).
Mã bắt đầu 255 không tuân theo chính xác thiết lập cơ bản, không có đầu cuối 0 nhưng tất cả các bit đều được sử dụng, cung cấp cho bạn 7 byte bổ sung (cờ nhiều bit được đặt thành 1, số đếm 7 1 và không có đầu cuối 0 vì tất cả các bit đều được sử dụng ; 7 nhóm 10xxxxxx, thêm 2 ^ 42 mã).
Việc thêm các ký tự này vào sẽ tạo ra bộ ký tự hiển thị tối đa cuối cùng là 4,468,982,745,216. Đây là nhiều hơn tất cả các ký tự đang được sử dụng hiện tại, các ngôn ngữ cũ hoặc đã chết và bất kỳ ngôn ngữ đã mất nào được cho là. Angelic hay Celestial script ai?
Ngoài ra, có những mã byte đơn bị bỏ qua / bỏ qua trong tiêu chuẩn UTF-8 ngoài 254 và 255: 128-191 và một số mã khác. Một số được sử dụng cục bộ bởi bàn phím, ví dụ mã 128 thường là xóa lùi. Các mã bắt đầu khác (và các dải ô được kết hợp) không hợp lệ vì một hoặc nhiều lý do ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
Unicode kết hợp chặt chẽ với UTF-8. Unicode đặc biệt hỗ trợ 2 ^ 21 điểm mã (2.097.152 ký tự), chính xác là số điểm mã được UTF-8 hỗ trợ. Cả hai hệ thống đều dành cùng một không gian 'chết' và các vùng hạn chế cho các điểm mã, v.v. ... tính đến tháng 6 năm 2018, phiên bản mới nhất, Unicode 11.0, chứa một kho gồm 137.439 ký tự
Từ tiêu chuẩn unicode. Câu hỏi thường gặp về Unicode
Chuẩn Unicode mã hóa các ký tự trong dải U + 0000..U + 10FFFF, tương đương với một không gian mã 21 bit.
Từ trang Wikipedia UTF-8. Mô tả UTF-8
Kể từ khi giới hạn không gian mã Unicode thành giá trị 21 bit vào năm 2003, UTF-8 được định nghĩa để mã hóa các điểm mã trong một đến bốn byte, ...