Sự khác biệt giữa UTF-8 và ISO-8859-1 là gì?
Sự khác biệt giữa UTF-8 và ISO-8859-1 là gì?
Câu trả lời:
UTF-8 là một mã hóa đa bào có thể đại diện cho bất kỳ ký tự Unicode nào. ISO 8859-1 là một mã hóa một byte có thể đại diện cho 256 ký tự Unicode đầu tiên. Cả hai đều mã hóa ASCII chính xác theo cùng một cách.
Wikipedia giải thích cả hai cách hợp lý: UTF-8 so với Latin-1 (ISO-8859-1). Trước đây là mã hóa có độ dài thay đổi, mã hóa độ dài cố định một byte sau. Latin-1 chỉ mã hóa 256 điểm mã đầu tiên của bộ ký tự Unicode, trong khi UTF-8 có thể được sử dụng để mã hóa tất cả các điểm mã. Ở cấp độ mã hóa vật lý, chỉ các điểm mã 0 - 127 được mã hóa giống hệt nhau; điểm mã 128 - 255 khác nhau bằng cách trở thành chuỗi 2 byte với UTF-8 trong khi chúng là các byte đơn với Latin-1.
UTF là một nhóm các lược đồ mã hóa nhiều byte có thể biểu thị các điểm mã Unicode có thể đại diện cho tối đa 2 ^ 31 [khoảng 2 tỷ] ký tự. UTF-8 là một hệ thống mã hóa linh hoạt, sử dụng từ 1 đến 4 byte để thể hiện các điểm mã 2 ^ 21 [khoảng 2 triệu] đầu tiên.
Câu chuyện dài: bất kỳ ký tự nào có đại diện điểm mã / thứ tự dưới 127, hay còn gọi là ASCII 7 bit an toàn được biểu diễn bằng cùng một chuỗi 1 byte như hầu hết các mã hóa byte đơn khác. Bất kỳ ký tự nào có điểm mã trên 127 được biểu thị bằng một chuỗi gồm hai byte trở lên, với các chi tiết của mã hóa được giải thích tốt nhất ở đây .
ISO-8859 là một họ các lược đồ mã hóa một byte được sử dụng để biểu diễn các bảng chữ cái có thể được biểu diễn trong phạm vi từ 127 đến 255. Các bảng chữ cái khác nhau này được định nghĩa là "các phần" theo định dạng ISO-8859- n , quen thuộc nhất trong những thứ này có thể là ISO-8859-1 hay còn gọi là 'Latin-1'. Như với UTF-8, ASCII 7 bit an toàn vẫn không bị ảnh hưởng bất kể họ mã hóa được sử dụng.
Hạn chế của sơ đồ mã hóa này là không có khả năng chứa các ngôn ngữ bao gồm hơn 128 ký hiệu hoặc hiển thị một cách an toàn nhiều hơn một họ ký hiệu cùng một lúc. Đồng thời, mã hóa ISO-8859 đã không còn được ưa chuộng với sự gia tăng của UTF. "Nhóm công tác" ISO chịu trách nhiệm về việc đã tan rã vào năm 2004, để lại bảo trì cho tiểu ban mẹ của nó.
ASCII: 7 bit. 128 điểm mã.
ISO-8859-1: 8 bit. 256 điểm mã.
UTF-8: 8-32 bit (1-4 byte). 1.112.064 điểm mã.
Cả ISO-8859-1 và UTF-8 đều tương thích ngược với ASCII, nhưng UTF-8 không tương thích ngược với ISO-8859-1:
#!/usr/bin/env python3
c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))
Đầu ra:
©
b'\xc2\xa9'
b'\xa9'
ISO-8859-1 là một tiêu chuẩn kế thừa từ những năm 1980. Nó chỉ có thể đại diện cho 256 ký tự nên chỉ phù hợp với một số ngôn ngữ trong thế giới phương tây. Ngay cả đối với nhiều ngôn ngữ được hỗ trợ, một số ký tự bị thiếu. Nếu bạn tạo một tệp văn bản trong bảng mã này và thử sao chép / dán một số ký tự tiếng Trung, bạn sẽ thấy kết quả kỳ lạ. Nói cách khác, đừng sử dụng nó. Unicode đã chiếm lĩnh thế giới và UTF-8 có khá nhiều tiêu chuẩn hiện nay trừ khi bạn có một số lý do kế thừa (như tiêu đề HTTP cần tương thích với mọi thứ).
Một điều quan trọng hơn để nhận ra: nếu bạn thấy iso-8859-1
, nó có thể đề cập đến Windows-1252 chứ không phải ISO / IEC 8859-1 . Chúng khác nhau trong phạm vi 0x80 Hay0x9F, trong đó ISO 8859-1 có mã điều khiển C1 và Windows-1252 có các ký tự hiển thị hữu ích thay thế.
Ví dụ: ISO 8859-1 có 0x85 là ký tự điều khiển (bằng Unicode, U + 0085, ``), trong khi Windows-1252 có dấu chấm lửng ngang (trong Unicode, U + 2026 HORIZONTAL ELLIPSIS, …
).
Thông số mã hóa WHATWG (như được sử dụng bởi HTML) rõ ràng tuyên bố iso-8859-1
là nhãn cho windows-1252
và các trình duyệt web không hỗ trợ ISO 8859-1 theo bất kỳ cách nào: thông số HTML nói rằng tất cả các mã hóa trong thông số Mã hóa phải được hỗ trợ và không còn nữa .
Ngoài ra, các tham chiếu ký tự số HTML về cơ bản sử dụng Windows-1252 cho các giá trị 8 bit thay vì các điểm mã Unicode; mỗi https://html.spec.whatwg.org/#numeric-character-reference-end-state ,…
sẽ tạo ra U + 2026 thay vì U + 0085.
Lý do của tôi để nghiên cứu câu hỏi này là từ quan điểm, là cách chúng tương thích với nhau. Bộ ký tự Latin1 (iso-8859) tương thích 100% để được lưu trữ trong kho dữ liệu utf8. Tất cả các ký tự ascii & Extended-ascii sẽ được lưu trữ dưới dạng một byte.
Đi theo một cách khác, từ bộ ký tự utf8 đến Latin1 có thể hoặc không thể hoạt động. Nếu có bất kỳ ký tự 2 byte nào (ký tự vượt quá 255-ascii 255), chúng sẽ không lưu trữ trong kho dữ liệu Latin1.